我在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);
非常感谢!
答案 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);