C# 分层Linq到SQL查询
假设你有一个产品数据库,这些产品与一个地区有关。每个区域都有一个父->子关系。例如,假设你可以在美国的任何地方买到香蕉,在明尼苏达州的任何地方买到苹果,在明尼阿波利斯的任何地方买到桔子 如果我想得到明尼阿波利斯市可供出售的产品(香蕉、苹果、橘子)的列表,我可能会提出这样一个Linq查询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()) {
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?