【问题标题】:Get an Entity Object with its child Entity with a condition (using Dynamic Linq)获取具有条件的实体对象及其子实体(使用动态 Linq)
【发布时间】:2014-05-13 13:37:18
【问题描述】:

这个问题是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()

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

有人可以帮我吗?

【问题讨论】:

  • 您的示例看起来有些过于复杂。您真的必须在代码中动态构建表达式吗?内置的 C# linq 支持对您来说还不够吗? (看看例如这里:dotnetperls.com/linq
  • 是的 Xmojmr,我必须构建动态表达式,因为我们在代码中使用动态列。如果我们有其他(静态)过滤子实体对象数据的方法并获得最终的父实体及其过滤的子实体,我可以保留其余代码。我曾尝试使用 linq 进行过滤,但我必须提供静态列才能获得最终的父实体。但就我而言,我不想使用静态列。
  • Where 也是IQueryableCount 的扩展

标签: c# asp.net-mvc-4 lambda entity-framework-5 dynamic-linq


【解决方案1】:

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

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

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

所以我把 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 方法将巧妙地理解我正在尝试做什么并将其转换为具有动态引用的表达式并生成与我正在寻找的表达式完全相同的表达式 -

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

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

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

【讨论】:

猜你喜欢
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多