我有一个包含ID号的对象列表。我想查询数据库中的一个表,以便为我提供ID 不与列表中任何对象的ID相匹配的所有行。
List<Item> allItems = new List<Item>();
// Populate allItems
Item
是具有public int ItemID
和public 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();
...但是这产生了类似的错误。
有人可以帮我吗?
答案 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();
。