【问题标题】:Help with Linq to Entities simple subquery帮助 Linq to Entities 简单子查询
【发布时间】:2010-01-21 21:39:40
【问题描述】:

我正在学习 Entity Framework,我正在尝试让以下场景发挥作用。

我有一个 Person 类和一个 Message 类。消息类有一个 From 属性和一个 To 属性,两者都是 Person 类型。我想使用 Linq to Entities 检索消息列表。我的数据库表是消息和人员。 Message 具有指向 Person 表的 PK ID 的 int 类型的 From 和 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,
                           };

如果您需要更多代码或背景信息,请告诉我。提前感谢您的帮助。

【问题讨论】:

    标签: linq-to-entities


    【解决方案1】:

    associations 应该介于 MessagePerson 之间。由于 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

    这是一种非常有效的数据加载方式(特别是与延迟加载相比,延迟加载会导致对太多列进行多次数据库查询),因为您只选择实际需要的列,并且所有操作都在一个查询中完成.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多