我有一个产品列表,我在查询中包含了ProductMetadatas,如下所示:
var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas).
Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active).ToList();
现在,我想要做的是根据CompanyId过滤ProductMetadats,例如
var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas).
Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active &&
x.ProductMetadatas.Where(pm => pm.CompanyId == LoggedInUser.CompanyId)).ToList();
如何在单个查询中执行此操作?
答案 0 :(得分:2)
如果您希望所有产品确实与您当前的用户公司匹配,您必须将其更改为以下内容:
var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas).
Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active &&
x.ProductMetadatas.Any(pm => pm.CompanyId == LoggedInUser.CompanyId)).ToList();
您可以猜测 .Any()检查列表中的任何元素是否与您的LINQ表达式匹配并返回布尔值。这样你的表达就有效了。
以前它无法正常工作,因为 .Where()会返回元素列表。
<强> 编辑: 强>
好的,因为有人注意到您要调整ProductMetdatas,您可以执行以下操作:
为IEnumerable<T>
:
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach(T item in source)
action(item);
}
然后像这样调整你的LINQ:
var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas).
Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active).
ForEach(x => x.ProductMetadatas = x.ProductMetadatas.
Where(pm => pm.CompanyId == LoggedInUser.CompanyId).ToList()).ToList();
现在,您在每个过滤ProductMetadatas的元素上调用一个函数,并将产品的属性设置为过滤的ProductMetadatas。
答案 1 :(得分:0)
您可以使用联接过滤。
var result = (from tbl in _dbContext.Set<Product>()
join lst in ProductMetadatas on lst.CompanyID eqauls LogginInUSer.CompanyID
where tbl.CompanyId == LoggedInUser.CompanyId && tbl.Active
select tbl)