Entity Framework - выберите коллекции вместе с одной сущностью в своей коллекции - PullRequest
0 голосов
/ 18 мая 2019

У меня есть два объекта в C #. Одним из них является Box. Другой - Ball.

A Ball должен принадлежать Box. Это означает, что BoxId на Ball.

public class Box
{
    public int Id { get; set; }
    public IEnumerable<Ball> Balls { get; set; }
}

public class Ball
{
    public int Id { get; set; }

    public int BoxId { get; set; }
    public Box Box { get; set; }

    public string Color { get; set; }
    public DateTime CreationTime { get; set; }
}

Теперь мне нужно взять несколько коробок, в которые вставлен последний шарик, потому что мне нужно знать его цвет.

Я пробовал так:


// Runs slow because there is too many balls.
var boxes = await Boxes
.Where(somecondition)
.Include(t => t.Balls)
.ToListAsync()

foreach (var box in boxes)
{
    // Get the color which I only need.
    box.Balls.OrderByDesending(t => t.CreationTime).First().Color;
}

Но при этом будут запрашиваться все шары в базе данных. Теперь есть много шаров (около 10 000 000), поэтому он запрашивает медленно.

Мне нужна только последняя вставленная коробка. Как я могу это сделать?

1 Ответ

1 голос
/ 18 мая 2019

Вы можете попробовать выбрать и выбрать только последнюю запись для шаров, как показано ниже.

Также, когда мы используем Select, мы можем удалить .Include, потому что это не будет иметь никакого эффекта.

var boxes = await Boxes
            .Where(somecondition)
            .Select(t => new Box(){
              Id = t.Id,
              Balls = t.Balls.OrderByDescending(x => x.CreationTime)
                         .Take(1)
            })               
            .ToListAsync()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...