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

时间:2019-01-17 17:51:13

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

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

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

Item是具有public int ItemIDpublic string Name的简单对象。

这是我尝试查询特定表的LINQ,以仅向我提供ItemID中作为allItems不存在的行:

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();

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

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

我将重写问题

  

我有一个列表(someItems)带有数字ID的对象。我想查询数据库中的表PurchasedItems,以便向我提供FK_ItemID 与列表{{1 }}。

我的答案:

someItems

正如@juharr的评论所指出的那样,EF无法处理非原始类型的集合,因为它试图将其转换为SQL。您可以先创建集合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();