如何通过 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();