Select 按列表中的 ID

Select by ID from a list

我有一个 table 的产品和一个 table 的类别,我可以 select 通过 CategoryID 像这样:

var result = db.tblProducts.Where(p => p.tblCategories.Any(c => c.ID == 1));

但是,我希望能够 select 基于类别列表:

 var catIDs = new List<int>() { 1,2,3 };

 var results = db.tblProducts.Where(r => r.tblCategories.Any(t => catIDs.Contains(t.ID)));

我收到以下错误:

LINQ to Entities does not recognize the method 'Boolean Contains(Int32)' method, and this method cannot be translated into a store expression.

大概是因为我正在使用 Contains 将实体与局部变量进行比较。有办法吗?

试试这个代码:

var catIDs = new List<int>() { 1,2,3 };

var results = db.tblProducts.Where(r => catIDs.Any(c => c == r.tblCategories.Id));

试试这个:

var query=from p in db.tblProducts
          from c in p.tblCategories
          where catIDs.Contains(c.ID)
          select p;

如果产品的至少一个类别在 catIDs 列表中,则该产品将被选中。

另一个选项可以从类别开始(我猜您在 ProductCategory 之间存在多对多关系,并且您在 Category实体):

var query=db.tblCategories.Where(c => catIDs.Contains(c.ID)).SelectMany(c=>c.tblProducts).Distinct();

也许你可以使用这个:

var catIDs = new List<int>() { 1,2,3 };
var results = db.tblCategories
  .Where(t => catIDs.Contains(t.ID))
  .SelectMany(t => t.tblProducts)
  .Distinct();

尝试从值创建 Expression。 F.e.:

static Expression MakeOrExpression<T, P>(Expression<Func<T, P>> whatToCompare, IEnumerable<P> values)
{
    Expression result = Expression.Constant(true);

    foreach (var value in values)
    {
        var comparison = Expression.Equal(whatToCompare, Expression.Constant(value));
        result = Expression.Or(result, comparison);
    }

    return result;
}

使用方法:

var results = db.tblProducts.Where(r => r.tblCategories.Any(MakeOrExpression(t => t.ID, catIDs)));

方法 MakeOrExpression 将为列表 { 1, 2, 3 } 动态创建表达式 t.ID == 1 || t.ID == 2 || t.ID == 3,然后 EF 会将其转换为 SQL 条件。