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

本文关键字:任何 属性 列表 对象 于对象 | 更新日期: 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)));

我不知道这会奏效,但可能会。(对缩进表示歉意……这只是为了避免滚动。)