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

时间:2015-08-10 22:35:30

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

我有一个我想重新加载数据的对象列表。 像往常一样,我有几个选择。我只想选择这些项目,但遇到了这个"其他信息":Unable to create a constant value of type 'Item'. Only primitive types or enumeration types are supported in this context.

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

我可以重新连接每个对象并调用重新加载,但是我会(或者不是,但我不知道如何)在db中运行很多次来重新加载它们{{1} }。

唯一的&#34;罚款&#34;直到现在我找到的解决方案是选择Navigation Properties Id然后运行它,如下所示:

selectedItems

但这是必要的还是有一种更直接,整洁或正确的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

  

但这是必要的还是有一种更直接,整洁或正确的方法来实现这一目标?

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

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

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