繁体   English   中英

获取带有条件的子实体的实体对象(使用Dynamic Linq)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM