C# 分层Linq到SQL查询

C# 分层Linq到SQL查询,c#,sql,linq,linq-to-sql,C#,Sql,Linq,Linq To Sql,假设你有一个产品数据库,这些产品与一个地区有关。每个区域都有一个父->子关系。例如,假设你可以在美国的任何地方买到香蕉,在明尼苏达州的任何地方买到苹果,在明尼阿波利斯的任何地方买到桔子 如果我想得到明尼阿波利斯市可供出售的产品(香蕉、苹果、橘子)的列表,我可能会提出这样一个Linq查询 public static List<Product> GetProducts(int regionId) { using (var db = new DataContext()) {

假设你有一个产品数据库,这些产品与一个地区有关。每个区域都有一个父->子关系。例如,假设你可以在美国的任何地方买到香蕉,在明尼苏达州的任何地方买到苹果,在明尼阿波利斯的任何地方买到桔子

如果我想得到明尼阿波利斯市可供出售的产品(香蕉、苹果、橘子)的列表,我可能会提出这样一个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();
        }
    }
}
公共静态列表GetProducts(int regionId)
{
使用(var db=new DataContext())
{
返回(来自数据库产品中的p)
其中GetRegions(regionId).Contains(p.Region)
选择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;
}
//伪代码,未测试。我觉得应该容易些。
私有静态列表GetRegions(int regionId,List regions=null)
{
如果(区域==null)
区域=新列表();
使用(var db=new DataContext())
{
var data=(以db.Regions中的r为单位)
其中r.Id==regionId
选择r).SingleOrDefault();
如果(数据!=null)
{
区域。添加(数据);
regions=GetRegions((int)data.ParentId,regions);
}
}
返回区;
}

您可以将GetRegions()的结果存储在regions中,然后执行以下操作

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

  regions.ForEach(t =>
      {
           productsToDisplay.AddRange(products.Where(u => u.RegionId == t.RegionId));
       }
  );
List productsToDisplay=new List();
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>();
productsToDisplay=(来自产品中的产品
在区域中加入区域
关于product.RegionId等于region.RegionId
选择产品);

您能添加
GetRegions
方法的代码吗?@FelipeOriani我添加了一个可能的GetRegions实现,我还没有在编译器中运行过它,我不确定它是否有效,它只是我前进方向的一个表示,我怀疑是否有更自然的东西我错过了。这是关于LINQ到实体的,不可能在LINQ到实体中编写递归查询。但是可以使用
和。。。AS(SELECT…
语法,然后通过调用泛型执行查询方法使用数据上下文执行它,该方法会自动使用与记录中的记录相同的属性填充对象(比如说
IEnumerable
。我想我没有看到它的价值?GetProducts看起来很干净,而且很有效,我认为可以做得更好的是GetRegions?