从LINQ Dynamic WHERE获取结果LINQ表达式

时间:2016-06-07 14:49:45

标签: c# entity-framework linq

我在LINQ Dynamic中有下一个代码:

var list = server1Products.Where("Field1 = @0 AND Field2 >= @2", arg1, arg2).ToList();

在使用LINQ Dynamic WHERE后,我需要得到生成的LINQ表达式所以在另一个列表中使用它

如何获得这样的LINQ表达式?

.Where("Field1 = @0 AND Field2 >= @2", arg1, arg2)

示例:

// get the LINQ expression from WHERE
var conditions = GetExpresionFromWhere(list); // HOW TO DO?
//
// apply the same filter expression on another list
var result2 = list2.Where(conditions);

非常感谢!

3 个答案:

答案 0 :(得分:2)

从本质上讲,DynamicLinq在这里为您做的是解析您传入的string(以及参数)到Expression<Func<T, bool>>

因此,为了将所需的Expression<Func<T, bool>>存储在变量中,您可以这样做:

var conditions = DynamicExpression.ParseLambda<ENTITY, bool>("Field1 = @0 AND Field2 >= @1", arg1, arg2);

ENTITY是您的实体类型)

然后使用它:

var result2 = list2.Where(conditions);

此外,如果list2不再是IQueryable<ENTITY>而是IEnumerable<ENTITY>,则您必须将Expression编译为Func<ENTITY, bool>,如下:

var result2 = list2.Where(conditions.Compile());

请参阅Source

答案 1 :(得分:1)

虽然您不太可能在已经执行后解析列表中使用的表达式,但您可以考虑存储表达式并在多个位置使用它:

Expression<Func<ServerProductClass, bool>> conditions = BuildWhereExpression();

您的BuildWhereExpression()方法如下所示,并生成必要的表达式:

public Expression<Func<ServerProductClass, bool>> BuildExpression(string predicate, object[] terms)
{
     return DynamicExpression.ParseLambda<ServerProductClass, bool>(predicate, terms);
}

所以你的整个代码看起来像这样:

// Build your condition
var condition = BuildExpression("Field1 = @0 AND Field2 >= @2", new object[]{arg1, arg2 });

// Filter your initial list
list = list.Where(condition).ToList();

// Use it again later
var list2 = someOtherList.Where(condition).ToList();

答案 2 :(得分:1)

// get the LINQ expression from WHERE
// Entity => your type of items in server1Products
Expression<Func<Entity, int>> conditions = x => x.Field1 == arg1 && x.Field2 = arg2;


// apply the same filter expression on another list
var result2 = list2.Where(conditions);