【问题标题】:Use Expression<Func<MyEntity, bool>> in Linq on MyEntity.<OtherEntity>.<MyProperty>在 MyEntity.<OtherEntity>.<MyProperty> 上的 Linq 中使用 Expression<Func<MyEntity, bool>>
【发布时间】:2019-09-30 09:54:02
【问题描述】:

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

但这不能编译:'方法名称预期'。 有没有办法完成我想做的事情?

【问题讨论】:

  • 我的眼睛无法编译这个x =&gt; x.A.&lt;MyProperty&gt; == 1。你确定你的出发点吗?
  • 也许我过于简化了。我用枚举更新了我的问题,现在更有意义了吗?
  • 使用谓词构建器。例如this one.
  • 过早优化是问题的根源。
  • @NKosi 你能详细说明一下吗?

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


【解决方案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);

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

【讨论】:

  • 我同意,记住给定的代码。但是,出于学习目的,我的想法可行吗?
猜你喜欢
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多