如何通过 LINQ 将具有嵌套循环的方法转换为 IQueryable 查询
how to convert a method with nested loops to IQueryable query via LINQ
如何通过 LINQ 将带有嵌套循环的此方法转换为 IQueryable 查询?
我想要一个数据库查询。在 db-scheme 下面,三个 类:MyObject、Region 和 Link。
public async Task<IEnumerable<Region>> GetData()
{
IEnumerable<Link> links = await Repositories.LinkDataDbSet.GetAllAsync();
IEnumerable<Region> regions = await Repositories.PlacesDbSet.GetAllAsync();
IEnumerable<MyObject> myObjects = await Repositories.MyObjectsDbSet.GetAllAsync();
foreach (Region region in regions)
{
var linkObjects = new List<MyObject>();
foreach (Link link in links.Where(r => r.regionId == region.id))
{
linkObjects.Add(myObjects.FirstOrDefault(r => r.id == link.objectId));
}
region.MyObjects = linkObjects;
}
return regions;
}
public class MyObject
{
public int id { get; set; }
}
public class Region
{
public int id { get; set; }
public IEnumerable<MyObject> MyObjects { get; set; }
}
public class Link
{
public int regionId { get; set; }
public int objectId { get; set; }
}
不知道您使用的是哪个版本的 EF 或 .Net/Core,但请试一试:
var regions = await (from place in Repositories.PlacesDbSet.AsQueryable()
join link in Repositories.LinkDataDbSet.AsQueryable() on place.id equals link.regionId
join obj in Repositories.MyObjectsDbSet.AsQueryable() on link.objectId equals obj.id into objsSet
select new Region
{
id = place.id,
MyObjects = objsSet
}).ToListAsync();
如何通过 LINQ 将带有嵌套循环的此方法转换为 IQueryable 查询? 我想要一个数据库查询。在 db-scheme 下面,三个 类:MyObject、Region 和 Link。
public async Task<IEnumerable<Region>> GetData()
{
IEnumerable<Link> links = await Repositories.LinkDataDbSet.GetAllAsync();
IEnumerable<Region> regions = await Repositories.PlacesDbSet.GetAllAsync();
IEnumerable<MyObject> myObjects = await Repositories.MyObjectsDbSet.GetAllAsync();
foreach (Region region in regions)
{
var linkObjects = new List<MyObject>();
foreach (Link link in links.Where(r => r.regionId == region.id))
{
linkObjects.Add(myObjects.FirstOrDefault(r => r.id == link.objectId));
}
region.MyObjects = linkObjects;
}
return regions;
}
public class MyObject
{
public int id { get; set; }
}
public class Region
{
public int id { get; set; }
public IEnumerable<MyObject> MyObjects { get; set; }
}
public class Link
{
public int regionId { get; set; }
public int objectId { get; set; }
}
不知道您使用的是哪个版本的 EF 或 .Net/Core,但请试一试:
var regions = await (from place in Repositories.PlacesDbSet.AsQueryable()
join link in Repositories.LinkDataDbSet.AsQueryable() on place.id equals link.regionId
join obj in Repositories.MyObjectsDbSet.AsQueryable() on link.objectId equals obj.id into objsSet
select new Region
{
id = place.id,
MyObjects = objsSet
}).ToListAsync();