Проблема
У меня есть запрос 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
Я только что заметил предупреждение в моем окне вывода отладки, которое привело меня к , эта ссылка о игнорируемых включает . Похоже, это на правильном пути, поскольку выходные данные отладки ясно указывают, что эти включения игнорируются.
Что не имеет смысла, так это то, что я выбираю анонимный в обоих примерах, и только один из них, кажется, игнорирует включения. Почему один, а не другой?