获取一个带有条件的实体对象及其子实体(使用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表达式错误。无法创建
有人能帮我一下吗?我弄清楚了动态表达式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);
c.CPNDocs.Where(Param_0 => (Param_0.L_STAT == True)).Count()
其中Param_0是为CPNDoc(CPNDocs中的一个Record实例)创建的动态引用。所以最后的结果我得到了我想要的。
Xmojmr,你上一个答案也是这个问题的答案。谢谢。