Включить против ThenInclude для свойств внуков в EF Core - PullRequest
2 голосов
/ 15 октября 2019

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

return source
    .Include(x => x.Server)
    .Include(x => x.Server.User)
    .Include(x => x.Server.ParentServer)
    .Include(x => x.Server.DataCenter);

или

return source
    .Include(x => x.Server)
        .ThenInclude(s => s.User)
    .Include(x => x.Server)
        .ThenInclude(s => s.ParentServer)
    .Include(x => x.Server)
        .ThenInclude(s => s.DataCenter);

Ответы [ 2 ]

3 голосов
/ 17 октября 2019

Они эквивалентны. Первый, очевидно, предпочтительнее, но это невозможно при навигации по коллекции. Следовательно, ThenInclude ().

// Won't compile
return source
    .Include(x => x.Posts.Authors)
    .Include(x => x.Posts.Comments);

// Compiles
return source
    .Include(x => x.Posts)
        .ThenInclude(x => x.Authors)
    .Include(x => x.Posts)
        .ThenInclude(x => x.Comments);

Но, если вы хотите отказаться от безопасности типов во время компиляции, вы также можете просто использовать перегрузки строк.

// Compiles, may throw
return source
    .Include("Posts.Authors")
    .Include("Posts.Comments");

Но, пожалуйста,не делай этого ...

// Over-thinking it ;-)
return source
    .Include(nameof(Blog.Posts) + "." + nameof(Post.Authors))
    .Include(nameof(Blog.Posts) + "." + nameof(Post.Comments));
1 голос
/ 15 октября 2019

Это очень интересный вопрос! Этот пункт вообще не задокументирован, если документация EF (Core).

Несколько недель назад я провел несколько тестов по этому поводу и пришел к выводу, что между этими методами нет разницы.

Я перепробовал десятки сценариев, от самых простых и глупых до 8-го уровня. иерархия отношений и сгенерированный SQL-запрос всегда были 100% идентичными .

Затем я посмотрел исходный код EF Core и не обнаружил реальных различий между реализациями Include() и ThenInclude().

Так что мой ответ не на 100% утвердительный, возможно, я что-то упускаю, но я думаю, что оба метода идентичны.

Если вы хотите получить окончательный ответ, я думаю, что лучшийспособ задать свой вопрос на репо EF Core .

...