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 存在的ItemID行allItems:
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_ItemID与ItemID对象 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您可以先创建集合。