как преобразовать метод с вложенными циклами в запрос IQueryable через LINQ - PullRequest
0 голосов
/ 05 марта 2020

Как преобразовать этот метод с вложенными циклами в запрос IQueryable через LINQ? Я хочу иметь один запрос к базе данных. Ниже дб-схемы три класса: 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; }
}

1 Ответ

0 голосов
/ 05 марта 2020

Не знаю, какую версию 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();
...