LINQ查询连接三张表

LINQ Query to join three tables

我需要以下 LINQ 查询方面的帮助。

 public interface IBrand
 {
      int BrandId { get; set; }
      IEnumerable<IBuyingAgency> BuyingAgencies { get; set; }
 }

 public interface IBuyingAgency
 {
      int BuyingAgencyId { get; set; }
 }

 public interface IClientGroup
 {
      IBuyingAgency BuyingAgency { get; set; }
      int ClientGroupId { get; set; }
 }


1).  var brands         = LoggedInUserHelper.GetUser().GetBrands(roles); // returns IEnumerable<Tuple<IBrand, string>>
2).  var buyingAgencies = LoggedInUserHelper.GetUser().GetBuyingAgencies(roles); //IEnumerable<IBuyingAgency>
3).  var clientGroups   = LoggedInUserHelper.GetUser().GetClientGroups(roles); //IEnumerable<IClientGroup>


 function IEnumerable<IClientGroup> GetClientGroups( List<int> BrandIds)
 {
     var brands         = LoggedInUserHelper.GetUser().GetBrands(roles); // returns IEnumerable<Tuple<IBrand, string>> 
     var buyingAgencies = LoggedInUserHelper.GetUser().GetBuyingAgencies(roles); //IEnumerable<IBuyingAgency>
     var clientGroups   = LoggedInUserHelper.GetUser().GetClientGroups(roles); //IEnumerable<IClientGroup>

  var lstBrandagencies = brands.Where(brand => BrandIds.Contains(brand.Item1.BrandId) &&  brand.Item1.BuyingAgencies.Any( ba => buyingAgencies.Contains(ba.BuyingAgencyId))).SelectMany(brand => brand.Item1.BuyingAgencies);

   var buyingAgencyIDs = lstBrandagencies.Select(b => b.BuyingAgencyId);

      clientGroups = clientGroups.Where(cg => buyingAgencyIDs.Contains(cg.BuyingAgency.BuyingAgencyId));

      return Mapper.Map<IEnumerable<IClientGroup>>(clientGroups.ToList());    

 }

我写了上面的函数但是没有用,它获取所有的客户组而不是过滤

我想写一个查询来获取所有满足以下条件的 ClientGroups

1. retrieve the brand from brands ( above ) that matches the list of brandId's passing in as parameter
2. Than get all the buyingAgencies under brands (1) above which matches with the id's of (2) above 
3. Finally get all clientgroups which matches with the buyingAgency retrieving in step (2) 

请你帮忙。

您没有在这一行中从源 2) 过滤

var buyingAgencyIDs = lstBrandagencies.Select(b => b.BuyingAgencyId);

只是根据之前的查询进行投影。

如果我没理解错的话你想这样做。

   var lstBrandagencies =  (from a in brands
                            where BrandIds.Contains(a.Item1.BrandId )
                            select a).SelectMany (b => b.Item1.BuyingAgencies )
                                     .Select (b => b.BuyingAgencyId );

   var buyingAgencyIDs =  from a in buyingAgencies
                          where  lstBrandagencies.Contains(a.BuyingAgencyId )                        
                          select a.BuyingAgencyId;

   var clientGroupsResult = clientGroups.Where(cg => buyingAgencyIDs.Contains(cg.BuyingAgency.BuyingAgencyId));