【问题标题】:Use tuples with Entity Framework Contains statement将元组与 Entity Framework Contains 语句一起使用
【发布时间】:2013-07-11 13:46:24
【问题描述】:

我有一个实体,它的引用是标识符和环境的组合。我想实现一个函数以允许用户传递 (ID, Environment) 的元组列表并返回所需的实体。在这种情况下可以使用 Contains() 吗?如何?有了简单的参考,就这么简单

model.MyEntities.Where(e => myIds.Contains(e.Id))

编辑:澄清一下,我不是在寻找如何使用 Contains() 方法来检索 ID 列表;我上面写的那行就是这样做的。我正在寻找的是能够检索与 (ID, Environment) 的元组匹配的实体列表,而不仅仅是 ID。

【问题讨论】:

  • stackoverflow.com/questions/6912733/… - 我想说你最好的办法是Union() 一起查询 ID,并希望 SQL 优化器能理解这一点。
  • 另一种选择是使用 LinqKit 动态构建 ORs 链。

标签: c# entity-framework


【解决方案1】:

最新版本的实体框架允许您对一组原始类型执行Contains(我认为它现在也适用于IEnumerable,我还没有尝试过)。

如果您仅在您的 Id 上匹配(即,如果 Tuple 的 ID 之一是 MyEntity.Id,则您的匹配很好,这将起作用(我在这里使用 Tuple,因为您的情况似乎是一个实际的对象;Tuple 只有ItemN 属性):

var containedIds = yourListOfTuples.Select(t => t.Id).ToArray();
model.MyEntities.Where(e => containedIds.Contains(e.Id));

这将有效地转换为 SQL 中的 WHERE ... IN ([the Ids in containedIds]) 语句。

【讨论】:

  • 只是为了扩展,将元组转换为普通数组很重要,因为 EF 本身无法将元组转换为 SQL。
  • @MystereMan 正确。我指定了array of primitive types,但我应该更明确。
  • 这并不能真正回答问题。我实际上已经在上面提到了如何将 Contains() 用于 ID。我的问题是实体框架是否支持将 Contains() 与复合键一起使用,例如myTuples.Contains(new {Id, Environment}).
  • @Rafid 上次我对此进行调查时,答案似乎是“不,没有其他人可以看到”。
  • @Rafid Contains 仅适用于原始类型,不幸的是。
猜你喜欢
  • 2013-07-01
  • 2011-06-22
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2016-10-31
相关资源
最近更新 更多