分层Linq到SQL查询

时间:2015-02-18 18:28:28

标签: c# sql linq linq-to-sql

我们假设您拥有一个产品数据库,这些产品与某个地区相关联。每个地区都有一个父母 - >孩子的关系。例如,假设您可以在美国的任何地方购买香蕉,在明尼苏达州的任何地方购买苹果,在明尼阿波利斯的任何地方购买橙子。

如果我想在明尼阿波利斯(Banana,Apple,Orange)获得可供销售的产品清单,我可能会像这样做一个Linq查询。

public static List<Product> GetProducts(int regionId)
{
    using (var db = new DataContext())
    {
        return (from p in db.Products
                where GetRegions(regionId).Contains(p.Region)
                select p).ToList();
        }
    }
}

我能想出的是GetRegions的样子,我只是将List作为可选参数,然后以递归方式添加到集合中吗?或者Linq语法内置了一些我不知道的更聪明(更少手动)的东西?

GetRegions

// Pseudo code, untested. I feel like it should be easier.
private static List<Region> GetRegions(int regionId, List<Region> regions = null)
{
    if (regions == null)
        regions = new List<Region>();

    using (var db = new DataContext())
    {
        var data = (from r in db.Regions
                    where r.Id == regionId
                    select r).SingleOrDefault();

        if (data != null)
        {
            regions.Add(data);
            regions = GetRegions((int)data.ParentId, regions);
        }
    }

    return regions;
}

1 个答案:

答案 0 :(得分:0)

您可以将GetRegions()的结果存储在区域中,然后执行类似这样的操作

 List<Product> productsToDisplay = new List<Product>(); 

  regions.ForEach(t =>
      {
           productsToDisplay.AddRange(products.Where(u => u.RegionId == t.RegionId));
       }
  );

productsToDisplay = (from product in products
                                join region in regions
                                on product.RegionId equals region.RegionId
                                select product).ToList<Product>();