[英]Get an Entity Object with its child Entity with a condition (using Dynamic Linq)
这个问题是动态Lambda表达式中Getting Count()属性的延续
我问过我们是否可以将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()
在此之前,我需要根据其成员变量过滤其数据。 我尝试使用动态表达式API,但Lambda表达式出错。 无法建立。
有人可以帮我吗?
我弄清楚了Dynamic Expression API是如何工作的。 正如我所说的,我对这些技术还不熟悉,但我仍在学习。
我必须实现c.CPNDocs.Where(d => d.L_STAT==true).Count()
我以为我们必须用字符串编写一个表达式,而Dynamic Expression API会将其解析为一个真实的Expression,但是我错了。 我们实际上必须告诉动态表达式API的 Parse方法我们想要做什么。
所以我将c.CPNDocs.Count()替换为
Expression expression = System.Linq.Dynamic.DynamicExpression.Parse(null, "c.CPNDocs.Count()", paramExSymbols);
与c.CPNDocs.Where(L_STAT == true).Count() 。 请注意Where子句,它没有LAMBDA表达式,而只有一个条件。 解析方法将聪明地理解我要执行的操作,并将其转换为带有动态引用的表达式,并生成与我正在寻找的表达式完全相同的表达式-
c.CPNDocs.Where(Param_0 => (Param_0.L_STAT == True)).Count()
其中Param_0是为CPNDoc(CPNDocs中的Record实例)创建的动态引用。 所以最终结果就是我想要的。
Xmojmr,您的最后答案也是该问题的答案。 谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.