在MyEntity上的Linq中使用Expression <Func <MyEntity,bool >>。<OtherEntity>。<MyProperty>

时间:2019-09-30 09:54:02

标签: c# .net entity-framework linq entity-framework-6

我正在尝试简化返回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));

但是,这不能编译:“需要方法名称”。 有没有办法完成我想做的事情?

1 个答案:

答案 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);

真正不需要简化显示的内容。