linq之如何使用 Linq 获取一对多关系中的事件行

jackei 阅读:58 2024-01-31 09:55:09 评论:0

我正在使用 EF4.3。在后端我有一个包含下表的数据库

在我的站点逻辑中,我检索实体层,但也预先加载 MatchNode、MatchBuyer 和 Buyer。

这是我获取所有 Tier 实体的逻辑:

    public static IEnumerable<Tier> Fetch() 
    { 
        using (var uow = new UnitOfWork(ConnectionString.Lenders)) 
        { 
            var r = new Repository<Tier>(uow.Context); 
 
            return r.Find() 
                .Include("MatchNodes.MatchBuyer.Buyer")            
                .ToList(); 
        } 
    } 

如您所见,一个 Tier 有多个 MatchNode,每个 MatchNode 是一个 MatchBuyer,MatchBuyer 是一个 Buyer。

然而我想做的是这个。仅包含 MatchNode 的 where enabled = true 和 Buyer: Status = 'Active'。

这是否可能,是否可以将其作为 .Where() 合并到下面的逻辑中?

请您参考如下方法:

你可以试试这个:

 return r.Find() 
         .Include("MatchNodes.MatchBuyer.Buyer")    
         .Where(c => c.MatchNodes 
                         .Any(c => c.Enabled == true &&  
                                   c.MatchBuyer.Buyer.Status == "Active") 
                   )         
          .ToList(); 

它将为您提供所有具有 MatchNodes.Enabled == true
TierBuyer.Status == "Active"

编辑
要仅返回 MatchNotes,请使用 SelectMany:

var lst =   r.Find() 
             .Include("MatchNodes.MatchBuyer.Buyer")    
             .Where(c => c.MatchNodes 
                             .Any(c => c.Enabled == true &&  
                                       c.MatchBuyer.Buyer.Status == "Active") 
                       ) 
              .SelectMany(c => c.MatchNodes)  //<-- SelectMany istead of Select        
              .ToList(); 

编辑 2
好的 - 所以上面的代码将找到具有至少一个 MatchNode 的项目(Tiers),其中 matchnode 已启用且 buyerstatus 为 actice。

我们可以通过将 .Any(..) 替换为 .All(..) 来更改它。
这将返回所有 Tiers,其中 all MatchNodes 满足要求。


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号