获取具有条件的子实体的实体对象(使用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,你最后的答案也是这个问题的答案。 谢谢。