匿名对象上的动态where条件



我想用这样的输入实现方法:

public async Task<IList<T>> Get(Expression<Func<Class1, Class2, Class3, bool>> predicate)
{ 
var query = from c1 in db.Class1
from c2 in db.Class2
from c3 in db.Class3
select new { c1, c2, c3 };
return query.Where(predicate).ToListAsync();
}

我想像Get((x, y, z) => x.Prop1 == 1 && y.Prop5 == 4)一样调用此方法

我有错误:

Error CS1503 Argument 2: cannot convert from 'System.Linq.Expressions.Expression<System.Func<Class1, Class2, Class3, bool>>' to 
'System.Linq.Expressions.Expression<System.Func<<anonymous type: Class1 pcp, Class2 pc, Class3 bu>, bool>>'

包含Where(predicate)的行中

如何解决此问题?

由于您的Get方法不可能返回匿名类型,并且您没有传入匿名类型(例如,使用用于类型推断的答案构造函数Expression(,因此您不能将匿名类型用于查询。

相反,创建一个显式类型并将其用于两者:

public class CAns {
public Class1 c1;
public Class2 c2;
public Class3 c3;
}
async Task<IList<CAns>> Get(Expression<Func<CAns, bool>> predicate)
{
var query = from c1 in db.Class1
from c2 in db.Class2
from c3 in db.Class3
select new CAns { c1 = c1, c2 = c2, c3 = c3 };
return query.Where(predicate).ToListAsync();
}

然后你可以用呼叫Get

var ans = Get(q => q.c1.Prop1 == 1 && q.c2.Prop5 == 4);

最新更新