我正在尝试简化返回IQueryable的方法
A,B和C扩展了BaseEntity,其中包含我要比较的枚举。 context是一个实体框架dbcontext。
这是该方法的简化版本:
return context.MyEntities.Include("A").Include("B").Include("C")
.Where(x => x.A.MyEnum == MyEnum.<value> && x.B.MyEnum == MyEnum.<value> && x.C.MyEnum == MyEnum.<value>);
我试图这样做:
Func<BaseEntity, bool> equals = x => x.MyEnum == MyEnum.<value>;
return context.MyEntities.Include("A").Include("B").Include("C")
.Where(x => equals(x.A) && equals(x.B) && equals(x.C));
它可以编译,但会给出运行时错误。据我了解,Linq无法将func <>转换为SQL? 因此我进行了搜索,发现您需要将func <>包裹在一个表达式<>中,以便Linq可以对其进行编译并将其转换为SQL。
现在我有了这个
Expression<Func<BaseEntity, bool>> equals = x => x.MyEnum == MyEnum.<value>;
return context.MyEntities.Include("A").Include("B").Include("C")
.Where(x => equals(x.A) && equals(x.B) && equals(x.C));
但是,这不能编译:“需要方法名称”。 有没有办法完成我想做的事情?
答案 0 :(得分:1)
编译错误是因为您必须先编译表达式才能调用它。
equals.Compile()(x.A)
但这违反了使用表达式开头的目的。
除了将重复值调用移到变量之外,提供的代码没有其他要简化的东西。
var value = MyEnum.<value>;
return context.MyEntities.Include("A").Include("B").Include("C")
.Where(x => x.A.MyEnum == value && x.B.MyEnum == value && x.C.MyEnum == value);
真正不需要简化显示的内容。