从列表中按ID进行选择

时间:2015-07-09 14:07:36

标签: c# linq entity-framework linq-to-entities

我有一个产品表和一个类别表,我可以选择ID的{​​{1}}这样:

Category

但是,我希望能够根据类别列表进行选择:

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

我收到以下错误:

  

LINQ to Entities无法识别方法'Boolean Contains(Int32)'方法,并且此方法无法转换为商店表达式。

大概是因为我使用 var catIDs = new List<int>() { 1,2,3 }; var results = db.tblProducts.Where(r => r.tblCategories.Any(t => catIDs.Contains(t.ID))); 将实体与局部变量进行比较。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:1)

尝试从值创建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将动态为列表t.ID == 1 || t.ID == 2 || t.ID == 3创建表达式{ 1, 2, 3 },然后EF会将其转换为SQL条件。

答案 1 :(得分:0)

试试这段代码:

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

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

答案 2 :(得分:0)

试试这个:

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();

答案 3 :(得分:0)

也许你可以使用它:

<div class="a">Box A
</div>
<div>another box
</div>
<div>another box
</div>
<div>another box
</div>
<div class="b">Box B
</div>