.Include() влияет на количество результатов запроса

#c# #entity-framework #asp.net-core #linq-to-sql #entity-framework-core

#c# #entity-framework #asp.net-ядро #linq-to-sql #entity-framework-core

Вопрос:

У меня очень простой запрос, который возвращает Order , но когда я выполняю один и тот же запрос со многими Includes , а ThenInclude затем запрос возвращает 0 результатов вместо 1

 var a = _context
        .Orders
        .FirstOrDefault(x => x.Id == OrderId);

var b = _context
        .Orders
        .OrdersFullInclude()
        .FirstOrDefault(x => x.Id == OrderId);
 

Где OrdersFullInclude() =

 public static IQueryable<Order> OrdersFullInclude(this IQueryable<Order> input)
{
    return  input
           .Include(x => x.StatusesHistory)
           .Include(x => x.File)
           .Include(x => x.SomeData)
           .ThenInclude(x => x.SomeDeeperLevel)
           .Include(x => x.Company)
           .Include(x => x.Customer)
           .Include(x => x.Insurance)
           .ThenInclude(x => x.InsuranceSomething); 
}
 

Почему?

Комментарии:

1.В запросе генерируется свойство навигации по ссылкам JOIN . Это JOIN либо INNER (для требуемого отношения), либо LEFT OUTER (для необязательного отношения). Поэтому проверьте сгенерированный SQL — любой INNER JOIN может отфильтровать результат. Скорее всего, вы сопоставили некоторые отношения по мере необходимости, в то время как в базе данных это не так.

2. @IvanStoev О, я думал, что это будет просто null . Спасибо

Ответ №1:

Вызывая Include , вы объединяете свой результат с некоторыми другими таблицами, и, по-видимому, не все объединенные таблицы имеют запись, связанную с записью в первом наборе результатов, поэтому она не возвращает результата.