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

C# 单个查询中的两个lambda表达式,c#,linq,lambda,C#,Linq,Lambda,我有一个产品列表,我在查询中包括ProductMetadata,如下所示: var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas). Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active).ToList(); var products = _dbContext.Set<Product>

我有一个产品列表,我在查询中包括ProductMetadata,如下所示:

var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas).
    Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active).ToList();
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();
var products=\u dbContext.Set()包含(x=>x.Productmetadatas)。
其中(x=>x.CompanyId==LoggedInUser.CompanyId&&x.Active).ToList();
现在,我想做的是根据公司ID筛选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();
var products=\u dbContext.Set()包含(x=>x.Productmetadatas)。
其中(x=>x.CompanyId==LoggedInUser.CompanyId&&x.Active&&
x、 ProductMetadatas.Where(pm=>pm.CompanyId==LoggedInUser.CompanyId)).ToList();

如何在单个查询中完成此操作?

如果您希望所有产品都与您当前的用户公司匹配,则必须将其更改为以下内容:

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();
var products=\u dbContext.Set()包含(x=>x.Productmetadatas)。
其中(x=>x.CompanyId==LoggedInUser.CompanyId&&x.Active&&
x、 ProductMetadatas.Any(pm=>pm.CompanyId==LoggedInUser.CompanyId)).ToList();
正如您所猜测的那样,.Any()检查列表中的任何元素是否与LINQ表达式匹配,并返回布尔值。因此,您的表达式是有效的

以前它无法工作,因为.Where()返回元素列表

编辑:

好的,正如前面提到的,要调整ProductMetData,可以执行以下操作:

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();
IEnumerable
创建扩展名:

publicstaticvoidforeach(此IEnumerable源代码,Action)
{
foreach(源中的T项)
行动(项目);
}
然后像这样调整LINQ:

var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas).
    Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active).ToList();
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();
var products=\u dbContext.Set()包含(x=>x.Productmetadatas)。
其中(x=>x.CompanyId==LoggedInUser.CompanyId&&x.Active)。
ForEach(x=>x.ProductMetadatas=x.ProductMetadatas。
其中(pm=>pm.CompanyId==LoggedInUser.CompanyId.ToList()).ToList();

现在,在每个元素上调用一个函数来过滤ProductMetadata,并将产品的属性设置为过滤后的ProductMetadata。

如果希望所有产品都与当前用户匹配,则必须将其更改为以下内容:

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();
var products=\u dbContext.Set()包含(x=>x.Productmetadatas)。
其中(x=>x.CompanyId==LoggedInUser.CompanyId&&x.Active&&
x、 ProductMetadatas.Any(pm=>pm.CompanyId==LoggedInUser.CompanyId)).ToList();
正如您所猜测的那样,.Any()检查列表中的任何元素是否与LINQ表达式匹配,并返回布尔值。因此,您的表达式是有效的

以前它无法工作,因为.Where()返回元素列表

编辑:

好的,正如前面提到的,要调整ProductMetData,可以执行以下操作:

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();
IEnumerable
创建扩展名:

publicstaticvoidforeach(此IEnumerable源代码,Action)
{
foreach(源中的T项)
行动(项目);
}
然后像这样调整LINQ:

var products = _dbContext.Set<Product>()Include(x=>x.Productmetadatas).
    Where(x => x.CompanyId == LoggedInUser.CompanyId && x.Active).ToList();
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();
var products=\u dbContext.Set()包含(x=>x.Productmetadatas)。
其中(x=>x.CompanyId==LoggedInUser.CompanyId&&x.Active)。
ForEach(x=>x.ProductMetadatas=x.ProductMetadatas。
其中(pm=>pm.CompanyId==LoggedInUser.CompanyId.ToList()).ToList();

现在,您可以在每个元素上调用一个函数来过滤ProductMetadatas,并将产品的属性设置为过滤后的ProductMetadatas。

您可以使用join进行过滤

    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)
var result=(来自_dbContext.Set()中的tbl)
在lst.CompanyID eqauls LogginInUSer.CompanyID上的ProductMetadatas中加入lst
其中tbl.CompanyId==LoggedInUser.CompanyId&&tbl.Active
选择tbl)

您可以使用连接进行筛选

    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)
var result=(来自_dbContext.Set()中的tbl)
在lst.CompanyID eqauls LogginInUSer.CompanyID上的ProductMetadatas中加入lst
其中tbl.CompanyId==LoggedInUser.CompanyId&&tbl.Active
选择tbl)

这样做有什么问题?你得到了什么样的结果?你期望得到什么?你只想要那些产品,它们有任何与公司ID匹配的ProductMetaData,还是所有ProductMetedatas都与公司ID匹配?你这样做有什么问题?你得到了什么样的结果?你期望得到什么?你只想要那些产品,它们有任何ProductMetaData与公司ID匹配,还是所有ProductMetedatas都与公司ID匹配?他想“过滤ProductMetadatas”,他不想过滤产品她想“过滤ProductMetadatas”,他不想过滤产品