帮助Linq实体简单子查询

时间:2010-01-21 05:13:45

标签: linq-to-entities

我正在学习实体框架,我正试图让以下场景发挥作用。

我有一个Person类和一个Message类。消息类具有From属性和To属性,两者都是Person类型。我想使用Linq to Entities检索消息列表。我的数据库表是Message和Person。消息具有指向Person表的PK ID的int和To类型的列。

以下是我到目前为止填充可查询的消息列表的代码。所以我的问题是加载Person数据。我怎样才能以最有效的方式做到这一点。任何有关该方法的解释都将不胜感激。

var messages = from m in _entities.Message
                           select new BizObjects.Message
                           {
                               MessageId = m.MessageId,
                               From = new BizObjects.Person
                               {
                                   PersonId = m.From
                               },
                               To = new BizObjects.Person
                               {
                                   PersonId = m.To
                               },
                               Subject = m.Subject,
                               Content = m.Content,
                               Read = m.Read,
                               CreatedOn = m.CreatedOn,
                           };

如果您需要更多代码或背景信息,请与我们联系。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

MessagePerson之间应该有associations。由于EF设计师自动创建它们,您可能已经这样做了。但是,由于它们是从外键而不是从列名生成的,因此自动创建的关联可能是使用不太有用的名称创建的,例如Message.Person1或其他。您可以在设计器中选择它们并将它们重命名为更有用的名称。

我们假设您的关联被称为Message.FromPersonMessage.ToPerson。然后,您就可以编写如下查询:

        var messages = from m in _entities.Message
                       select new BizObjects.Message
                       {
                           MessageId = m.MessageId,
                           From = new BizObjects.Person
                           {
                               PersonId = m.FromPerson.PersonId,
                               PersonName = m.FromPerson.PersonName
                           },
                           To = new BizObjects.Person
                           {
                               PersonId = m.ToPerson.PersonId,
                               PersonName = m.ToPerson.PersonName
                           },
                           Subject = m.Subject,
                           Content = m.Content,
                           Read = m.Read,
                           CreatedOn = m.CreatedOn,
                       };

通过在LINQ to Entities查询中使用关联属性,我使实体框架将此引用转换为SQL中的LEFT OUTER JOIN

这是一种非常有效的加载数据的方法(特别是与延迟加载相比,这会导致多列数据库查询太多),因为您只选择了实际需要的列,而这一切都是在一个查询中完成的