我在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));
摆脱对象比较没有帮助。我被卡住了。我该如何管理?
答案 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)));
我知道那会起作用,但可能会有效。 (为缩进道歉...这只是为了避免滚动。)