Linq - Сортировать по вкл. - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть ситуация, когда нужно сделать OrderBy для объекта Include.Вот как я пытался до сих пор

Customers query = null;

try
{
    query = _context.Customers
        .Include(x => x.CustomerStatus)
        .ThenInclude(x => x.StatusNavigation)
        .Select(x => new Customers()
        {
            Id = x.Id,
            Address = x.Address,
            Contact = x.Contact,
            Name = x.Name,
            CustomerStatus = new List<CustomerStatus>
            {
                x.CustomerStatus.OrderByDescending(y => y.Date).FirstOrDefault()
            }
        })
        .FirstOrDefault(x => x.Id == 3);
}
catch (Exception ex)
{
    throw;
}

Приведенный выше код успешно упорядочивает элемент include, но он не включает его дочернюю таблицу.Например: Customer включает CustomerStatus, но CustomerStatus не включает таблицы StatusNavigation.

Я даже пытался с этим, но ни один из них не может помочь мне

_context.Customers
    .Include(x => x.CustomerStatus.OrderByDescending(y => y.Date).FirstOrDefault())
    .ThenInclude(x => x.StatusNavigation).FirstOrDefault(x => x.Id == 3);

Что я делаю не так, пожалуйста, сообщите мне кого-нибудь

Даже я пытался таким образом

var query = _context.CustomerStatus
                .GroupBy(x => x.CustomerId)
                .Select(x => x.OrderByDescending(y => y.Date).FirstOrDefault())
                .Include(x => x.StatusNavigation)
                .Join(_context.Customers, first => first.CustomerId, second => second.Id, (first, second) => new Customers
                {
                    Id = second.Id,
                    Name = second.Name,
                    Address = second.Address,
                    Contact = second.Contact,
                    CustomerStatus = new List<CustomerStatus> {
                        new CustomerStatus
                        {
                            Id = first.Id,
                            CustomerId = first.CustomerId,
                            Date = first.Date,
                            StatusNavigation = first.StatusNavigation
                        }
                    },

                }).FirstOrDefault(x => x.Id == 3);

, но это попадало в базы данных 3 раза и фильтровало результат в памяти.Сначала выберите все данные из статуса клиента, затем из статуса, а затем из клиента, а затем отфильтруйте все данные в памяти.Есть ли другой эффективный способ сделать это ??

Это то, как я подготовился к классу сущностей enter image description here

1 Ответ

0 голосов
/ 25 сентября 2019

Я думаю, что происходит, что вы на самом деле переопределяете Include и ThenInclude.Include явно предназначен для загрузки свойства навигации.Однако вы делаете пару вещей, которые могут этому помешать.

Сначала вы выбираете новый Customer.Одного этого может быть достаточно, чтобы сломать логику Include.Во-вторых, вы переопределяете то, что попадает в коллекцию CustomerStatus.В идеале это должно быть просто загружено автоматически через Include, но, изменив его так, чтобы он имел только первую сущность, вы фактически отбрасываете эффект Include.(Выбор отношения достаточен, чтобы вызвать соединение, без явного вызова Include).В-третьих, ThenInclude основывается на Include, поэтому переопределение, которое, вероятно, также выбрасывает ThenIncude.

Все это гипотеза.Я не делал ничего в точности так, как вы делаете здесь раньше, но больше ничего не имеет смысла.

Попробуйте также выбрать новый CustomerStatus:

CustomerStatus = x.CustomerStatus.OrderByDescending(o => o.Date).Select(s => new CustomerStatus
{
    x.Id,
    x.Status,
    x.Date,
    x.CustomerId,
    x.Customer,
    x.StatusNavigation
 })

Вы можетеудалите Include / ThenInclude в этой точке, потому что акт выбора этих отношений приведет к объединению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...