如何使用Linq获得1对多关系中的活动行?

时间:2013-06-17 09:09:50

标签: linq

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

enter image description here

在我的网站逻辑中,我检索实体层,但也急切加载MatchNode,MatchBuyer和买方。

这是我获取所有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都是一个买家。

但我想做的就是这个。仅包括MatchNode的enabled = true和Buyer:Status ='Active'。

这是否可行,是否可以作为.Where()纳入下面的逻辑?

1 个答案:

答案 0 :(得分:2)

你可以试试这个:

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

它将为您提供Tier的所有MatchNodes.Enabled == true个 和Buyer.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
好的 - 所以上面的代码会找到至少一个 Tiers的项目(MatchNode),其中启用了matchnode并且appstatus是actice。

我们可以将.Any(..)替换为.All(..)来更改它 这将返回Tiers所有所有 MatchNodes满足要求的所有内容。