这个问题是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/

10-13 06:07