在 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);
实际上不需要尝试简化显示的内容。
我正在尝试简化 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);
实际上不需要尝试简化显示的内容。