任何属性都等于任何对象列表

时间:2012-03-14 07:02:24

标签: c# entity-framework

我在Entity-Framework中遇到问题,使用Code-First,我无法解决。

拥有

类型的实体
public class Product {
  public int ID {get; set; }
  public virtual ICollection<Category> Categories { get; set; }
}

public class Category {
  public int ID {get; set;}
  public virtual ICollection<Product> Products { get; set; }
  // rest omitted
}

在我的数据库中,我尝试从给定类别的列表中获取至少具有一个类别的所有产品。我需要一个表达式,因为这个表达式稍后会与其他表达式结合使用。

IE中。我试过了:

var searchFor = new List<Category>{...};
var expression = product => product.Categories.Any(cat => searchFor.Contains(cat))

稍后针对DbContext

执行此操作
context.Products.Where(expression).ToList();

创建一个主要表示This context supports primitive types only

的异常

将其更改为

var expression = product => product.Categories.Any(
                              cat => searchFor.Any(d => d.ID == cat.ID));
摆脱对象比较没有帮助。我被卡住了。我该如何管理?

2 个答案:

答案 0 :(得分:2)

您应该删除List<Category>,将其替换为ID列表,如下所示:

// I'm assuming that ID is of type long; please fix as necessary
var searchFor = new List<long>{...};
var expression = product =>
    product.Categories.Any(cat => searchFor.Contains(cat.ID))

答案 1 :(得分:1)

如果您已经有了类别列表,则可以在以外的查询中构建ID列表:

var searchForIds = searchFor.Select(x => x.ID).ToList();
var query = context.Products
                   .Where(product => product.Categories
                                     .Any(cat => searchForIds.Contains(cat.ID)));

知道那会起作用,但可能会有效。 (为缩进道歉...这只是为了避免滚动。)