【发布时间】:2011-05-27 18:47:19
【问题描述】:
我是 Entity Framework 的新手,不确定何时使用预先加载和Include,何时使用带有Select 的 LINQ 查询,以及何时按需加载实体。我也不知道 EF 是否以及何时缓存实体。 (是的,我最终会阅读文档 :-)
我正在为 ASP .NET MVC 网站构建一个内部消息传递系统,性能非常重要。想象一下下面的场景。
当 Rihanna 进入她的收件箱时,她需要查看一个邮件列表,每封邮件都有发件人的姓名和图片。想象一下约翰为他的新歌写了蕾哈娜的歌词。在她的收件箱中,有一条带有约翰照片的消息。当约翰进入他的发件箱时,他看到了同样的信息,上面有蕾哈娜的名字和照片。
因此,当我们从数据库中获取消息时,我们可能需要发件人和收件人的个人资料图片。想象以下查询:
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 ) );
这个查询会有效吗?考虑到User.ID 和UserProfile.UserID 是一对一的,有什么方法可以在不加载SenderUser 的情况下加载SenderUser.UserProfile.Image?我想我需要为此使用 LINQ JOIN。这是正确的吗?
当只需要一个字段时,使用 LINQ 避免加载所有字段是否更有效(例如,仅从 UserProfile 加载 ImageID)?
在代码中的某处使用Load 做同样的事情会更好吗?
这样的查询每次都进入数据库吗?想象一下,我们有一千条消息,都来自同一个人。我们会每次都查询他的Image吗?
我正在使用 EF 4 和 ASP .NET MVC 3。
谢谢。
【问题讨论】:
标签: c# entity-framework entity-framework-4 linq-to-entities