c# - 如何选择与对象列表中的属性值共享属性值的所有对象?

标签 c# linq entity-framework linq-to-entities

我有一个对象列表,我想重新加载它们的数据。 像往常一样,我有几种选择。我只想选择这些项目,但遇到了这个“附加信息”:无法创建“项目”类型的常量值。在此上下文中仅支持原始类型或枚举类型。

// (System.Collections.Generic.List<Item> selectedItems)

System.Collections.Generic.List<Item> items;
var q = from i in db.Items
        where selectedItems.Any(s => s.Id == i.Id)
        select i;
items = q.ToList()

下面的结果和预期的一样...

var q = db.Items.Where(i => selectedItems.Any(si => i.Id == si.Id));
items = q.ToList();

我本可以重新附加每个对象并调用重新加载,但我会(或不会,但我不知道如何)多次运行数据库以重新加载它们的 Navigation Properties.

到目前为止,我发现的唯一“好”解决方案是选择 selectedItemsId,然后按如下方式运行:

int[] itemIds = selectedItems.Select(i => i.Id).ToArray();
var q = db.Items.Where(i => itemIds.Any(iId => i.Id == iId)); //Of course `Contains` could be used instead of `Any` here, since `itemIds` is a simple array of integers
items = q.ToList();

但这是必要的还是有更直接、简洁或正确的方法来实现这一点?

最佳答案

But is it a necessity or there is a more straight forward, neat or proper way to accomplish this?

不是我能想到的。 EF 会尝试将您的 where 子句转换为 SQL(这并不像您想象的那么容易)。当它解析表达式并遇到对非基本类型集合的 Any 的调用时,它不知道如何将该列表一般地转换为值列表以放入 in 子句并给出您引用的错误。

当源集合是原始类型或枚举类型的集合时,它可以将源集合转换为值列表并创建一个in 子句。 Contains 做同样的事情(它也更短更接近恕我直言的意图):

var q = db.Items.Where(i => itemIds.Contains(i.Id)); 

关于c# - 如何选择与对象列表中的属性值共享属性值的所有对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31930296/

相关文章:

c# - 在列表中搜索组合

c# - Entity Framework 中的真正合并语句

c# - 获取对象列表的属性的所有值

c# - 应用洞察监控

c# - 哪个 winForm 控件用于此目的?

c# - 带有 Lambda 表达式的 LINQ - 连接、分组依据、求和和计数

c# - 无法从泛型强制转换以获取 LINQ where 子句

c# - 自引用多对多递归关系代码优先 Entity Framework

azure - "Login failed for user"在 Azure SQL 中为 "The underlying provider failed on Open"

.net - 错误 175 : The specified data store provider cannot be found