Я новичок в Entity Framework и не знаю, когда использовать энергичную загрузку и Include
, когда использовать запросы LINQ с Select
и когда загружать объекты по требованию. Я также не знаю, когда и когда EF кеширует сущности. (Да, я буду читать документы в конце концов: -)
Я строю систему обмена сообщениями внутри веб-сайта ASP .NET MVC, и производительность будет очень важной. Представьте себе следующий сценарий.
Когда Рианна входит в свой почтовый ящик, ей нужно увидеть список сообщений, каждое из которых содержит имя отправителя и его фотографию. Представьте, что Джон написал стихи Рианны для своей новой песни. В ее почтовом ящике есть сообщение с фотографией Джона. Когда Джон входит в свой почтовый ящик, он видит то же сообщение с именем и фотографией Рианны.
Итак, когда мы получаем сообщение из базы данных, нам могут потребоваться изображения профиля отправителя и получателя. Представьте себе следующий запрос:
private static Func<MyEntities, int, Message> _getMessageByIdQuery = CompiledQuery.Compile(
( MyEntities ctx, int messageId ) => ctx.Messages
.Include( "SenderUser" )
.Include( "SenderUser.UserProfile.Image" )
.Include( "RecipientUser" )
.Include( "RecipientUser.UserProfile.Image" )
.SingleOrDefault( message => message.ID == messageId ) );
Будет ли этот запрос эффективным? Есть ли способ загрузить SenderUser.UserProfile.Image
без загрузки SenderUser
, учитывая, что User.ID
и UserProfile.UserID
один на один? Я полагаю, мне нужно будет использовать LINQ JOIN для этого. Это правильно?
Является ли более эффективным использование LINQ, чтобы избежать загрузки всех полей, когда требуется только одно поле (например, только загрузка ImageID
из UserProfile
)?
Лучше ли сделать то же самое, используя Load
где-нибудь в коде?
Идет ли такой запрос в базу данных каждый раз? Представьте, что мы получили тысячу сообщений от одного человека. Будем ли мы запрашивать его Image
каждый раз?
Я использую EF 4 и ASP .NET MVC 3.
Спасибо.