单个查询中的两个lambda表达式

时间:2017-07-21 11:25:37

标签: c# linq lambda

我有一个产品列表,我在查询中包含了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();

如何在单个查询中执行此操作?

2 个答案:

答案 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)