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