代码之家  ›  专栏  ›  技术社区  ›  Guillermo Gomez

关于Linq to Entities简单子查询的帮助

  •  1
  • Guillermo Gomez  · 技术社区  · 15 年前

    我正在学习实体框架,并尝试使以下场景工作。

    我有个人课和信息课。message类有一个from属性和一个to属性,均为person类型。我想使用linq to实体检索消息列表。我的数据库表是message和person。消息具有int类型的“从”和“到”列,这些列指向人员表的pk id。

    下面是我迄今为止用来填充可查询消息列表的代码。所以我这里的问题是加载个人数据。我怎样才能以最有效的方式来做这件事呢?对于该方法的任何解释都将非常感谢。

    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 回复  |  直到 15 年前
        1
  •  1
  •   Craig Stuntz    15 年前

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

    假设你的协会被称为 Message.FromPerson Message.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,
                           };
    

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

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