Включить не работает в запросе LINQ, но работает в API LINQ Fluent - PullRequest
0 голосов
/ 10 января 2019

Проблема

У меня есть запрос LINQ (против Entity Framework), который использует Include для включения некоторых свойств навигации. Одно из этих свойств использует ThenInclude для включения своей собственной коллекции свойств. Когда я запускаю запрос, свойства первого уровня включаются в первичный объект, но подколлекция (использующая ThenInclude) всегда пуста.

Однако, если я изменю запрос на использование формы Fluent API, запрос будет работать, и подколлекция фактически будет включена. Почему это работает для формы Fluent, а не для обычного запроса LINQ?

Пример

//FAIL - This returns Benefits but Benefits.Dates.Count = 0 on all Benefits
var list1 = (from s in _context.Subscribers
               .Include(s => s.Dates)
               .Include(s => s.Benefits)
               .ThenInclude(b => b.Dates)
               where s.Id == 13643
               select new { benefits = s.Benefits }).ToList();

//SUCCESS - This returns Benefits and Benefits.Dates.Count is > 0 on the ones with Dates
var list2 = _context.Subscribers
               .Include(s => s.Dates)
               .Include(s => s.Benefits)
               .ThenInclude(b => b.Dates)
               .Where(s => s.Id == 13643)
               .Select(s => new { benefits = s.Benefits}).ToList();

Я ошибаюсь, что эти запросы должны давать одинаковый результат?

Обновление

Я только что попытался вручную связать вещи с помощью LINQ, и я могу получить включенные даты льгот - предоставленные, это не яблоки с яблоками, поскольку результирующий набор отличается, но суть в том, что Include(b => b.Dates), кажется, работает в этом случае ,

var list3 = (from s in _context.Subscribers.Include(s => s.Dates)
             join b in _context.Benefits.Include(b => b.Dates) on s.Id equals b.SubscriberId
             select new {benefits = b}).ToList();

Я начинаю задаваться вопросом, может ли ThenInclude() быть немного более ограничительным в том, где / когда его можно использовать?

Обновление 2

Я только что заметил предупреждение в моем окне вывода отладки, которое привело меня к , эта ссылка о игнорируемых включает . Похоже, это на правильном пути, поскольку выходные данные отладки ясно указывают, что эти включения игнорируются.

Что не имеет смысла, так это то, что я выбираю анонимный в обоих примерах, и только один из них, кажется, игнорирует включения. Почему один, а не другой?

1 Ответ

0 голосов
/ 10 января 2019

Это всего лишь предположение: поскольку у вас есть Datas, как в Subscribers, так и в Benefits, есть вероятность, что вы не запрашиваете правильную модель / сущность ... вы можете попробовать подтвердить тип сущности как показано ниже (при условии, что Benefit является вашим типом сущности).

var list1 = (from s in _context.Subscribers
               .Include(s => s.Dates)
               .Include(s => s.Benefits)
               .ThenInclude(b => (b as Benefit).Dates)
               where s.Id == 13643
               select new { benefits = s.Benefits }).ToList();

var list2 = _context.Subscribers
           .Include(s => s.Dates)
           .Include(s => s.Benefits)
           .ThenInclude(b => (b as Benefit).Dates) // <-- I suggest renaming s to b
           .Where(s => s.Id == 13643)
           .Select(s => new { benefits = s.Benefits}).ToList();
...