这个问题是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中的记录。
我可以使用动态表达式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,您的最后答案也是该问题的答案。谢谢。
关于c# - 获取带有条件的子实体的实体对象(使用Dynamic Linq),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23632811/