【发布时间】:2014-05-13 13:37:18
【问题描述】:
这个问题是Getting Count() property in Dynamic Lambda Expression的延续
我问过我们是否可以将 Count() 方法放入动态 lambda 表达式中。我可以使用 Dynamic Expression API 来做到这一点。答案由 - xmojmr 提供
但最近我不得不实现一个动态 Lambda 表达式来获取带有过滤数据的子实体的结果。
详情:
我有一个父实体与它的子实体链接。现在,当我从父实体获取数据时,它也会返回一个包含子数据的数据集合。
根据我之前的要求,我必须计算与每个父记录相关的所有子记录。
我已经使用 -
ParameterExpression cParam = Expression.Parameter(typeof(CPNDBase), "c");
NewExpression newExp = Expression.New(typeof(DTDataModel));
List bindings = new List();
MemberInfo memberInfo = typeof(DTDataModel).GetMember("FILE_COUNT")[0];
Dictionary paramExSymbols = new Dictionary();
paramExSymbols.Add("c", cParam);
Expression expression = System.Linq.Dynamic.DynamicExpression.Parse(null, "c.CPNDocs.Count()", paramExSymbols);
MemberBinding memberBinding = Expression.Bind(memberInfo, expression);
bindings.Add(memberBinding);
MemberInitExpression memberInitExpression = System.Linq.Expressions.Expression.MemberInit(newExp, bindings);
Expression> selector = (Expression>)BinaryExpression.Lambda(memberInitExpression, cParam);
var finalFilteredCPNData = filteredCPNData.AsQueryable().Select(selector);
这里 c 参考父结果集和 c.CPNDocs.Count() 尝试计算 CPNDocs 中的记录,这是子实体结果集。
我可以使用 Dynamic Expression API 实现这一点。
现在我最近的需求是修改我之前的需求,我需要为
生成动态表达式c.CPNDocs.Where(a => a.L_STAT == true).Count()
在计数之前,我需要根据其成员变量过滤其数据。 我曾尝试使用 Dynamic Expression API,但 Lambda 表达式出现错误。无法构建它。
有人可以帮我吗?
【问题讨论】:
-
您的示例看起来有些过于复杂。您真的必须在代码中动态构建表达式吗?内置的 C# linq 支持对您来说还不够吗? (看看例如这里:dotnetperls.com/linq)
-
是的 Xmojmr,我必须构建动态表达式,因为我们在代码中使用动态列。如果我们有其他(静态)过滤子实体对象数据的方法并获得最终的父实体及其过滤的子实体,我可以保留其余代码。我曾尝试使用 linq 进行过滤,但我必须提供静态列才能获得最终的父实体。但就我而言,我不想使用静态列。
-
Where也是IQueryable和Count的扩展
标签: c# asp.net-mvc-4 lambda entity-framework-5 dynamic-linq