0

我正在使用 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 表达式?

更新:这是我到目前为止的状态(在最后一行我卡住了)。此外,我试图使用 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);
4

4 回答 4

0

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

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

于 2013-11-07T10:20:47.880 回答
0
.Where( t => t.Any(i => i=="part3"))
于 2013-10-31T11:06:51.103 回答
-1

要获取与给定条件匹配的项目,请使用:

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);
于 2013-10-31T11:24:58.657 回答
-1

我认为这就是你想要的:

myContext.MyEntityCollection
    .Where(item => item.MyProperty != null)
    .AsEnumerable<MyEntity>()
    .Where(item => item.MyProperty.Split(new [] { ',' }).Any(p => p == "part3"));
于 2013-10-31T11:33:15.257 回答