gpt4 book ai didi

c# - 添加到 Lambda 表达式并使用 Entity Framework

转载 作者:行者123 更新时间:2023-11-30 12:21:48 26 4
gpt4 key购买 nike

如果我想用一个已经存在的 lambda 树表达式检索更多的列 如下所示,我该怎么做?这适用于 Entity Framework 并希望它仍然有效。

Expression<Func<DivisionTeam, DirectorTeamModel>> columns= (d) => new DirectorTeamModel
{
Id = d.Id,
TeamId = d.Team.Id
};

if (criteria.Template == ExportTemplate.Import || criteria.Template == ExportTemplate.Default)
{
// Retrieve additional columns from "columns" expression tree
}

return _divisionTeamsRepository.GetPagedResults(criteria.Page, criteria.PageSize, @where.Expand(), string.Format("{0} {1}", criteria.SortOrder, criteria.SortDirection), columns);

最佳答案

给定两个“选择器”表达式,您必须从它们的 MemberInitExpression 中获取绑定(bind),并使用所有绑定(bind)创建一个新表达式。但是这个表达式是行不通的,因为它对一个参数使用了两个不同的参数表达式。我们也需要解决这个问题。

鉴于...

Expression<Func<TSource, TResult>> left = ... // columns
Expression<Func<TSource, TResult>> right = ... // more columns

...获取绑定(bind)...

var leftInit = left.Body as MemberInitExpression;
var rightInit = right.Body as MemberInitExpression;

var bindings = leftInit.Bindings.Concat(rightInit.Bindings);

...创建一个新表达式...

var result = Expression.Lambda<Func<TSource, TResult>>(
Expression.MemberInit(Expression.New(typeof(TResult)), bindings), ???);

...但是,需要单个参数...

var binder = new ParameterBinder(left.Parameters[0], right.Parameters[0]);
var bindings = binder.Visit(leftInit.Bindings.Concat(rightInit.Bindings));

// now, just use right.Parameters[0] as parameter...

并且,使用表达式访问者替换参数效果很好:

class ParameterBinder : ExpressionVisitor
{
readonly ParameterExpression parameter;
readonly Expression replacement;

public ParameterBinder(ParameterExpression parameter, Expression replacement)
{
this.parameter = parameter;
this.replacement = replacement;
}

protected override Expression VisitParameter(ParameterExpression node)
{
if (node == parameter)
return replacement;

return base.VisitParameter(node);
}
}

抽象这些管道的东西效果很好。事实上,你可以只使用 existing library (剧透:我是作者),这应该会导致类似的结果:

var merged = columns.Apply(moreColumns);

关于c# - 添加到 Lambda 表达式并使用 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43822899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com