表达式树来拆分属性值

时间:2013-10-31 11:03:36

标签: c# linq expression-trees

我正在使用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 ..)

E.g。在这个输入

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

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

如何为split func&lt;&gt;?创建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 个答案:

答案 0 :(得分:0)

.Where( t => t.Any(i => i=="part3"))

答案 1 :(得分:0)

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

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

答案 2 :(得分:-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);

答案 3 :(得分:-1)

我认为这就是你想要的:

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