获取具有条件的子实体的实体对象(使用Dynamic Linq)
这个问题是Dynamic Lambda Expression中的Getting Count()属性的延续
我问过我们是否可以将Count()方法放在动态lambda表达式中。 我可以使用Dynamic Expression API来完成它。 答案由 – xmojmr提供
但是最近我不得不实现一个Dynamic Lambda Expression来获得带有过滤数据的子实体的结果。
细节 :
我有一个父实体与其子实体链接。 现在,当我从父实体获取数据时,它也会返回包含其子数据的数据集合。
根据我之前的要求,我必须计算每个父记录返回的所有子记录。
我用它做了 –
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()
在计数之前,我需要根据其成员变量过滤其数据。 我尝试过使用Dynamic Expression API但是为Lambda表达式收到错误。 无法构建它。
有人可以帮我这个吗?
我弄清楚Dynamic Expression API的工作原理。 正如我所说,我是这些技术的新手,我还在学习。
我必须实现c.CPNDocs.Where(d => d.L_STAT==true).Count()
我认为我们必须在字符串中编写表达式,而动态表达式API会将其解析为真正的表达式,但我错了。 我们实际上必须告诉动态表达式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表达式而只是一个条件。 Parse方法将巧妙地理解我想要做的事情并将其转换为带有动态引用的Expression并生成与我正在寻找的完全相同的表达式 –
c.CPNDocs.Where(Param_0 => (Param_0.L_STAT == True)).Count()
其中Param_0是为CPNDoc创建的动态引用(CPNDocs中的Record实例)。 所以最后的结果我得到了我想要的东西。
Xmojmr,你最后的答案也是这个问题的答案。 谢谢。