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

本文关键字:实体 使用 Dynamic 对象 Linq 一个 有条件 获取 | 更新日期: 2023-09-27 18:03:20

这个问题是动态Lambda表达式中getcount()属性的延续

我问我们是否可以把Count()方法在动态lambda表达式。我可以使用动态表达式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()

在count之前,我需要根据它的成员变量过滤它的数据。我已经尝试了动态表达式API,但得到Lambda表达式错误。无法创建

有人能帮我一下吗?

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

我弄清楚了动态表达式API是如何工作的。正如我所说,我是这些技术的新手,我还在学习。

I had to achieve - c.CPNDocs.Where(d => d.L_STAT==true).Count()

我认为我们必须写一个字符串表达式和动态表达式API将解析它到一个真正的表达式,但我错了。实际上,我们必须告诉Parse方法动态表达式API我们想要做什么。

所以我将c.CPNDocs.Count()替换为

Expression expression = System.Linq.Dynamic.DynamicExpression.Parse(null, "c.CPNDocs.Count()", paramExSymbols);

与<<p> strong> 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,你上一个答案也是这个问题的答案。谢谢。