Entity framework core, использовать include с условием

168
07 декабря 2018, 10:50

Необходимо скачать из базы данных сущности диалогов вместе с последним сообщением. Такой код не работает:

_dbContext.Dialogs
    .Where(_ => _.Users.Any(ud => ud.ApplicationUserId == userId))
    .Include(_ => _.Messages.Where(m => m.Id == _.Messages.Max(mm => mm.Id)))
    .ToListAsync();

Ошибка: The Include property lambda expression is invalid. The expression should represent a property access: 't => t.MyProperty'.

Как мне скачать одним запросом диалоги только последними сообщениями?

Answer 1

Если условие только одно - можно развернуть связь:

_dbContext.Messages
    .Where(_ => m.Id == _.Dialog.Messages.Map(mm => nn.Id))
    .Where(_ => _.Dialog.Users.Any(ud => ud.ApplicationUserId == userId))
    .Include(_ => _.Dialog)
    .ToListAsync();

В более сложных случаях вы можете загрузить анонимный класс:

_dbContext.Dialogs
    .Where(_ => _.Users.Any(ud => ud.ApplicationUserId == userId))
    .SelectMany(_ => new { 
        dialog = _,
        message = _.Messages.Where(m => m.Id == _.Messages.Max(mm => mm.Id))).FirstOrDefault(),
    })
    .ToListAsync();

PS вот такая проверка - m.Id == _.Messages.Max(mm => mm.Id) однажды может стать убийцей производительности, осторожнее с ней.

READ ALSO
Как передать тип параметром функции c#?

Как передать тип параметром функции c#?

Хочу написать функцию для упрощения получения GET реквестов между winforms и web_api

209
OnMouseDown не вызывается

OnMouseDown не вызывается

Нажимаю на обьект на который повешен скрипт, и ничего не происходитОбъект двумерный

113
Как в Regex в качества аргумента передать массив?

Как в Regex в качества аргумента передать массив?

Подскажите, как в Regex передать массив Я попытался, но компилятор выдает ошибку

206
IE расширение регистрация в windows

IE расширение регистрация в windows

Работаю с BHO IE на C#

180