任何属性都等于对象列表中的任何属性
本文关键字:任何 属性 列表 对象 于对象 | 更新日期: 2023-09-27 18:27:48
我在使用代码优先的实体框架中遇到了一个问题,无法解决。
具有类型的实体
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();
创建一个异常,主要说明CCD_。
将其更改为
var expression = product => product.Categories.Any(
cat => searchFor.Any(d => d.ID == cat.ID));
去掉对象比较也无济于事。我被卡住了。我该怎么办?
您应该去掉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))
如果你已经有了一个类别列表,你可以在查询之外构建一个ID列表:
var searchForIds = searchFor.Select(x => x.ID).ToList();
var query = context.Products
.Where(product => product.Categories
.Any(cat => searchForIds.Contains(cat.ID)));
我不知道这会奏效,但可能会。(对缩进表示歉意……这只是为了避免滚动。)