我有一个产品表和一个类别表,我可以选择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)));
将实体与局部变量进行比较。有没有办法做到这一点?
答案 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
列表中,则会选择产品。
另一种选择可以从类别开始(我猜你在Product
和Category
之间存在多对多关系,并且您的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>