【问题标题】:LINQ query Where ID does not exist as a property in a list of objectsLINQ 查询 Where ID 不作为对象列表中的属性存在
【发布时间】:2019-06-11 23:42:17
【问题描述】:

我有一个包含 ID 号的对象列表。我想在我的数据库中查询一个表,以提供 ID 与列表中任何对象的 ID 匹配的所有行。

List<Item> allItems = new List<Item>();
// Populate allItems

Item 是一个带有public int ItemIDpublic string Name 的简单对象。

这是我尝试查询特定表的 LINQ,只给我在allItems 中不作为ItemID 存在的行:

var filtered = ctx.PurchasedItems.Where(x => allItems.Select(y => y.ItemID).ToList().Contains(x.FK_ItemID)).ToList();

如您所见,dbo.PurchasedItems 有一个列 FK_ItemID 与对象 Item 中的 ItemID 匹配。

虽然可以编译,但运行时出现以下错误:

"无法创建类型的常量值 'DemoProject.Models.ItemDatabase.PurchasedItems'。只有原始类型 或枚举类型在此上下文中受支持。"

我尝试的另一种方法是:

var p = ctx.PurchasedItems.Where(x => x.FK_ItemID.IsAnyOf(allItems.Select(y => y.ItemID).ToArray())).ToList();

...但这产生了类似的错误。

谁能帮帮我?

【问题讨论】:

  • 不确定,可能选择 (y => y.ItemID == System.DBNull)
  • 在两个查询中这样做效率更高: var items = allItems.Select(x => x.ItemID).ToList(); var filters = ctx.PurchasedItems.Where(x => items.Contains(x.FK_ItemID)).ToList();
  • @jdweng 并不是说​​效率更高,而是 EF 无法处理非原始类型的集合,因为它试图将其转换为 SQL。
  • 以下将起作用,但效率较低: var filters = ctx.PurchasedItems.Where(x => allItems.Select(x => x.ItemID).Contains(x.FK_ItemID)).ToList ();

标签: c# sql entity-framework linq entity-framework-6


【解决方案1】:

我会改写问题

我有一个带有数字 ID 的对象列表 (someItems)。我想在我的数据库中查询一个表PurchasedItems,以提供FK_ItemID 与列表someItems 中任何对象的ID 匹配的所有行。

我的回答:

List<Item> someItems = new List<Item>();
// Populate someItems
List<int> someItemIDs = someItems.Select(i=>i.ID).ToList();
var filtered = ctx.PurchasedItems
                  .Where(x => !someItemIDs.Contains(x.FK_ItemID))
                  .ToList();

正如@juharr 的评论所指出的,EF 无法处理非原始类型的集合,因为它试图将其转换为 SQL。您可以先创建集合someItemIDs

【讨论】:

  • 谢谢。这实际上是我在其他地方使用的解决方案 - 2 个单独的查询 - 但我认为这有点作弊,并且有一种方法可以让我尝试的查询工作。感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多