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

Use Expression<Func<MyEntity, bool>> in Linq on MyEntity.<OtherEntity>.<MyProperty>

我正在尝试简化 returns IQueryable

的方法

A、B 和 C 扩展了包含我要比较的枚举的 BaseEntity。 context 是一个 entity framework 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));

但这无法编译:'Method name expected'。 有什么方法可以完成我想做的事情吗?

编译错误是因为必须先编译表达式才能调用它。

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

实际上不需要尝试简化显示的内容。