【发布时间】:2019-06-11 23:42:17
【问题描述】:
我有一个包含 ID 号的对象列表。我想在我的数据库中查询一个表,以提供 ID 不 与列表中任何对象的 ID 匹配的所有行。
List<Item> allItems = new List<Item>();
// Populate allItems
Item 是一个带有public int ItemID 和public 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