【问题标题】:Can I use predicates from my Domain Model in Entity Framework Code First?我可以在 Entity Framework Code First 中使用我的域模型中的谓词吗?
【发布时间】:2016-03-31 10:54:58
【问题描述】:

我有一个带有bool 方法的类,例如:

public bool IsInFuture()
{ return this.Date > DateTime.Now; }

我使用 EF Code First 将其存储在数据库中。如果我尝试在 Linq 操作中使用该谓词,我会得到一个异常,因为它不能被翻译成 SQL:

await context.Where(order => order.IsInFuture()).ToListAsync();

该谓词的逻辑可能相当复杂,我不想在我的代码中重复它。有什么方法可以将其代码“内联”到 Linq 操作中?我很确定,这个问题有解决办法。

提前致谢!

【问题讨论】:

  • 为什么这需要一个布尔方法?在我看来它只是一个返回属性,然后您可以在 linq await context.Where(order => order.IsInFuture).ToListAsync(); 中使用它
  • 然后我需要将此属性存储在数据库中。我需要计算它们。
  • 您不能使用自定义函数。您可以使用表达式,但它们必须可转换为 SQL。
  • 可以在实体类上用[NotMapped]注解
  • @IvanStoev,当然,我的谓词方法被承诺被翻译成 SQL。使用表达式有什么好的解决方案吗?

标签: c# entity-framework linq domain-driven-design


【解决方案1】:

您不能直接使用谓词。 EF 应该如何知道如何将其转换为 SQL WHERE 语句?

你有几个选择:

  • 改写查询以使用标准操作,例如小于。不过,这将复制谓词中的逻辑。
  • 使用原始 SQL 查询。这也将复制逻辑,但在 SQL 中。
  • 加载整个实体列表,然后在内存中过滤(即Where()ToList() 之后)。像这样,您可以重用谓词。 请注意,这仅适用于非常小的数据集。

【讨论】:

  • 我有一个想法来强制内联谓词函数。从理论上讲,这应该会有所帮助。我会尝试在几天内完成。也许有人有经验可以分享?
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多