gpt4 book ai didi

c# - 获取具有条件的实体对象及其子实体(使用 Dynamic Linq)

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:38 27 4
gpt4 key购买 nike

这个问题是 Getting Count() property in Dynamic Lambda Expression 的延续

我问过我们是否可以将 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()

这里在count之前我需要根据它的成员变量过滤它的数据。我已尝试使用 Dynamic Expression API 但 Lambda 表达式出现错误。无法构建它。

有人可以帮我解决这个问题吗?

最佳答案

我了解了Dynamic Expression API 的工作原理。正如我所说,我是这些技术的新手,但我仍在学习。

我必须实现 - c.CPNDocs.Where(d => d.L_STAT==true).Count()

我以为我们必须在字符串中编写一个表达式,动态表达式 API 会将它解析为一个真正的表达式,但我错了。我们实际上必须告诉 Dynamic Expression APIParse 方法我们想要做什么。

所以我在

中替换了 c.CPNDocs.Count()

表达式表达式 = System.Linq.Dynamic.DynamicExpression.Parse(null, "c.CPNDocs.Count()", paramExSymbols);

使用 c.CPNDocs.Where(L_STAT==true).Count()。请注意 Where 子句,它没有 LAMBDA 表达式,而只有一个条件。 Parse 方法将巧妙地理解我正在尝试做什么,并将其转换为具有动态引用的表达式,并生成与我正在寻找的完全相同的表达式 -

c.CPNDocs.Where(Param_0 => (Param_0.L_STAT == True)).Count()

其中 Param_0 是为 CPNDoc(CPNDocs 中的记录实例)创建的动态引用。所以最终结果我得到了我要找的东西。

Xmojmr,你最后的回答也是这个问题的答案。谢谢。

关于c# - 获取具有条件的实体对象及其子实体(使用 Dynamic Linq),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23632811/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com