【问题标题】:Expression tree to split property value用于拆分属性值的表达式树
【发布时间】:2013-11-08 21:47:34
【问题描述】:

我正在使用 linq 表达式树 (http://msdn.microsoft.com/en-us/library/vstudio/bb397951.aspx) 来创建复杂的、动态创建的自定义过滤器。 现在我需要创建一个表达式,它不比较我的表的属性,而是 我拆分财产的每一部分。

相应的静态 linq 语句为:

myContext.MyEntityCollection
 .Where(item => item.MyProperty != null)
 .AsEnumerable<MyEntity>()
 .Select(item => item.MyProperty.Split(new[] { ',' })
 .Where( .. my filter ..)

例如在这个输入上

Table MyEntity
Id          MyProperty
-----------------------------------
1           part1,part2,part3,part4
2           part5,part6

我想搜索“part3”并获得第一行。

如何为 split func 创建 lambda 表达式?

UPDATE:这是我目前的状态(在最后一行我卡住了)。我还尝试使用 ExpressionTreeViewer 从上面的 linq 语句构建表达式树,但它不起作用,我认为是因为“.AsEnumerable”。

ParameterExpression param = Expression.Parameter(typeof(ReportIndex), "MyEntity");
MemberExpression stringProperty = Expression.Property(param, "MyProperty");
MethodInfo mi = typeof(string).GetMethod("Split", new[] { typeof(char[]) });
MethodCallExpression splitExpression = 
    Expression.Call(exDateProperty, mi, Expression.Constant(new[] { '|' }));
MethodInfo containsMethod = typeof(ICollection<string>).GetMethod("Contains");
var expression = Expression.Call(param, containsMethod, splitExpression, stringProperty);

【问题讨论】:

  • .FirstOrDefault(p =&gt; p.Contains("part3"));
  • @Rune FS:你为什么改标题?我对获取 linq 查询不感兴趣。这很简单。我真的需要 linq 表达式语句。
  • 什么是“linq 表达式语句”? :|
  • 这不是您要查找的表达式树。表达式树是语句的计算表示。即当你使用代码动态构建代码时
  • 我指的是可以用作 linq 提供程序的表达式树。见msdn.microsoft.com/en-us/library/vstudio/bb397951.aspx

标签: c# linq expression-trees


【解决方案1】:
.Where( t => t.Any(i => i=="part3"))

【讨论】:

  • 稍微解释一下您的答案如何以及为什么会起作用会很好。现在它只是一段代码。
【解决方案2】:

经过多次尝试,我认为用表达式树是不可能的。 我最后做的是改变我的数据模型。

UPDATE由于一周内没有新的输入,我将其设为答案。

【讨论】:

    【解决方案3】:

    要获得符合给定条件的项目,请使用:

    var rows = myContext.MyEntityCollection
        .Where(item => item.MyProperty != null)
        .AsEnumerable<MyEntity>()
        .FirstOrDefault(item => item.MyProperty.Contains("part3"));
    

    获取所有匹配的行:

    var rows = myContext.MyEntityCollection
        .Where(item => item.MyProperty != null)
        .AsEnumerable<MyEntity>()
        .Where(item => item.MyProperty.Contains("part3"));
    

    或者如果你因为某种原因需要使用Split:

    var rows = myContext.MyEntityCollection
        .Where(item => item.MyProperty != null)
        .AsEnumerable<MyEntity>()
        .Where(item => item.MyProperty.Split(new[] { ',' }).Contains("part3"));
    

    更清晰的版本:

    var rows = myContext.MyEntityCollection
        .Where(item => item.MyProperty != null)
        .AsEnumerable<MyEntity>()
        .Select(item => new 
            {
                Item = item,
                Parts = item.MyProperty.Split(new[] { ',' })
            })
        .Where(itemWithParts => itemWithParts.Parts.Contains("part3"))
        .Select(itemWithParts => itemWithParts.Item);
    

    【讨论】:

      【解决方案4】:

      我想这就是你想要的:

      myContext.MyEntityCollection
          .Where(item => item.MyProperty != null)
          .AsEnumerable<MyEntity>()
          .Where(item => item.MyProperty.Split(new [] { ',' }).Any(p => p == "part3"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多