我正在学习实体框架,我正试图让以下场景发挥作用。
我有一个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,
};
如果您需要更多代码或背景信息,请与我们联系。在此先感谢您的帮助。
答案 0 :(得分:1)
Message
和Person
之间应该有associations。由于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,
};
通过在LINQ to Entities查询中使用关联属性,我使实体框架将此引用转换为SQL中的LEFT OUTER JOIN
。
这是一种非常有效的加载数据的方法(特别是与延迟加载相比,这会导致多列数据库查询太多),因为您只选择了实际需要的列,而这一切都是在一个查询中完成的