Select 按列表中的 ID
Select by ID from a list
我有一个 table 的产品和一个 table 的类别,我可以 select 通过 Category
的 ID
像这样:
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
列表中,则该产品将被选中。
另一个选项可以从类别开始(我猜您在 Product
和 Category
之间存在多对多关系,并且您在 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 条件。
我有一个 table 的产品和一个 table 的类别,我可以 select 通过 Category
的 ID
像这样:
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
列表中,则该产品将被选中。
另一个选项可以从类别开始(我猜您在 Product
和 Category
之间存在多对多关系,并且您在 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 条件。