LINQ查询连接三个表

时间:2016-04-14 12:43:27

标签: linq linq-to-sql

我需要LINQ Query的帮助,如下所示。

 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());    

 }

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

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

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) 

请帮助。

1 个答案:

答案 0 :(得分:1)

你没有从你的来源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));