【问题标题】:Getting Count() property in Dynamic Lambda Expression在动态 Lambda 表达式中获取 Count() 属性
【发布时间】:2014-04-30 14:45:25
【问题描述】:

我几乎得到了我需要的东西,但只有一个地方我卡住了。我需要在 Lambda 表达式中动态构建 fileCount = c.CPNDocs.Count()。下面是我用来构建动态 Lambda 表达式的 cmets 代码。

var dColDefaultList = new List<String>() { "Download", "I_ID", "C_TYP", "C_LST_ACT" };       // <------- Columns I need in Lambdas Expression

ParameterExpression cParam = Expression.Parameter(typeof(CPNDBase), "c");

NewExpression newExp = Expression.New(typeof(DTDataModel));

List<MemberBinding> bindings = new List<MemberBinding>();

foreach (String sCol in dColDefaultList)
{
    if (!String.Equals(sCol, "Download")) {
        bindings.Add(GetMemberBinding(sCol, cParam, sCol));
    }
    else
    {
        bindings.Add(GetMemberBinding("fileCount", cParam, "CPNDocs.Count()")); //   <-------need count of rows return from CPNDocs(Different Table) is a Object I recieved from     Entity Relatioship
    }
}

MemberInitExpression memberInitExpression =         System.Linq.Expressions.Expression.MemberInit(newExp, bindings);

Expression<Func<CPNDBase, DTDataModel>> selector = (Expression<Func<CPNDBase,   DTDataModel>>)BinaryExpression.Lambda(memberInitExpression, cParam);

// selector  will be selector = {c => new DTDataModel() {fileCount = c.CPNDocs, I_ID =   c.I_ID, C_TYP = c.C_TYP, C_LST_ACT = c.C_LST_ACT }}
// but I Need selector = {c => new DTDataModel() {fileCount = c.CPNDocs.Count(), I_ID = c.I_ID, C_TYP = c.C_TYP, C_LST_ACT = c.C_LST_ACT }}

// Question is How can I make fileCount = c.CPNDocs.Count() ?

var resultLm = finalFilteredCPNData.AsQueryable<CPNDBase>().Select(selector);

上面的方法在这里定义:

static MemberBinding GetMemberBinding(string property, ParameterExpression param,  string column)
{
    MemberInfo memberInfo = typeof(DTDataModel).GetMember(property)[0];
    MemberExpression memberExpression = LambdaExpression.PropertyOrField(param, column);
    return System.Linq.Expressions.Expression.Bind(memberInfo, memberExpression);
}

有人知道我该怎么做吗?

【问题讨论】:

  • 代码看起来很“丑陋”。你考虑过使用stackoverflow.com/questions/5163147/…
  • 我正在尝试从父表中获取所有字段,其中包含一个自定义列,其中包含相对于父表中的每条记录的所有子记录的计数。链接解释了有关过滤的所有内容,但我正在尝试其他方法。如果您提供的链接中缺少某些内容,请告诉我。

标签: c# asp.net-mvc-4 dynamic lambda


【解决方案1】:

Count() 不是属性。它是在静态类中实现的扩展方法。这种扩展方法在多个地方实现。正确的位置取决于您的类继承自什么。要找到正确的位置,请使用 Visual Studio 的“转到定义”功能。

例如对于IQueryable.Count(),扩展方法由System.Linq.Queryable静态类实现,可以在这里看到→http://referencesource.microsoft.com/#System.Core/System/Linq/IQueryable.cs

因此,为了对表达式进行编码,您需要对扩展方法的调用进行编码。

从字符串生成表达式树的简单得多的方法很早就在 Microsoft 发布的原型中展示过。介绍性文章可用,例如在Dynamic Expressions and Queries in LINQ

我们成功地使用了自动“string to linq”引擎的原始源代码的修改版本,它大大简化了开发。通过检查System.Linq.Dynamic 的源代码,您可以找到编码表达式的确切方法。提到通过 NuGet 提供的原始源代码的链接,例如在 Stack Overflow 文章中Dynamic LINQ - Is There A .NET 4 Version?

【讨论】:

  • 非常感谢xmojmr,其实我是这些技术的新手,很难理解所有这些。但是我通过引用您的link 来掌握正确的方法。真的是帮助满满。最后我能够附加一个带有结果集的计数字段。多言的帮助。再次非常感谢。你的回答真的很有帮助。
  • 您好 xmojmr,我想您可以帮我解决这个问题 - stackoverflow.com/questions/23632811/…,我正在尝试使用动态表达式在其 count() 之前过滤数据,但未能生成.你能帮我解决这个问题吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多