LINQ 查询其中 ID 不作为对象列表中的属性存在

MSO*_*ACC 3 c# sql linq entity-framework entity-framework-6

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

List<Item> allItems = new List<Item>();
// Populate allItems
Run Code Online (Sandbox Code Playgroud)

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

这是我尝试查询特定表的 LINQ,只提供不作为 in 存在的ItemIDallItems

var filtered = ctx.PurchasedItems.Where(x => allItems.Select(y => y.ItemID).ToList().Contains(x.FK_ItemID)).ToList();
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,dbo.PurchasedItems有一列FK_ItemIDItemID对象 Item 中的 相匹配。

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

“无法创建“DemoProject.Models.ItemDatabase.PurchasedItems”类型的常量值。在此上下文中仅支持原始类型或枚举类型。”

我尝试的另一种方法是:

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

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

谁能帮我吗?

小智 6

我将重写问题

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

我的答案:

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();
Run Code Online (Sandbox Code Playgroud)

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