首页 新闻 会员 周边 捐助

Linq to Entities框架问题-怎么返回两个实体表的联合数据?不想建立框架外的多余联合实体

0
悬赏园豆:50 [已解决问题] 解决于 2009-06-12 15:10

Linq to Entities框架问题-怎么返回两个实体表的联合数据?不想建立框架外的多余联合实体

例如:我有一个Messages表和一个Users表,两表通过UserId建主外关系.

需求中我查找Messages表中数据同时还有发消息的User数据,两表在实体中也是主外关联。

我用LINQ查询时试图给Messages的User导航属性赋值,但报错“无法创建该实体或不支持复杂实体操作”,现在我是单独又建了一个具有两个表字段的类来返回数据.

我是刚接触LINQ和实体框架,我想应该有通过实体框架解决的好一些的方法,大家帮解决一下.

问题补充: ent是实体模型; var msgs = ( from user in ent.Users from msg in user.Msgs //Msgs是导航属性 where userId = UserId(这是传进来的变量) select new MessageInfo { MessageId = msg.MessageId Contents = msg.Contents User = new UserInfo //User是导航属性 { //只返回USER表里这两个字段,其他字段不需要 UserId = msg.User.UserId UserName = msg.User.UserName } }).FirstOrDefault(); return msgs.ToList<MessageInfo>(); 其实我就是想在实体查询中同时返回来自两个相关实体集中需要的字段的数据(或两个实体). 我也做过这样的尝试但错误一样. select new MessageInfo { MessageId = msg.MessageId Contents = msg.Contents User = msg.User //错误应该就是这个地方了,取回整条记录也不行,这里linq 好像无法进行像强类型方式的赋值操作 } 具体错误是: “在 LINQ to Entities 查询中无法构造实体或复杂类型” @Gray Zhang 不好意思,模型中关联了,上边取值时漏写了 @斯克迪亚 的回答让我注意到了Reference副本,很感谢. 学习了. 另: Reference.Load()的加载方式是怎么样的? 每次LOAD()都执行一次默认LINQ查询 还是在实体查询时就已经加载到缓存中?还是其它? 前者怕会有无畏的数据库连接? 谢谢.
Mr__BRIGHT的主页 Mr__BRIGHT | 初学一级 | 园豆:165
提问于:2009-06-08 19:18
< >
分享
最佳答案
0

导航属性使用起来很简单的,不需要你去编写额外的访问代码来获取。

你只需要获取到实体对象,并将其导航属性加载(每个导航属性都有一个后缀为Reference的副本,比如一个导航属性名为Car,那么就还会有一个CarReference属性,该属性的Load()方法可用于立即加载导航属性的数据),然后直接访问其导航属性就可以了。

比如要检索第一个用户以及他所拥有的所有短消息,可以这样写:

//取出第一个用户

var u=ent.Users.First();

//立即加载其拥有的所有短消息

u.MsgsReference.Load();

//输出所有短消息

foreach(var f in u.Msgs)

{

  ...

}

 

如果获得短消息的发送者(假设该导航属性名为Sender)也是同理:

 

//取出一个ID号为变量s的短消息

var m=ent.Messages.First(f=>f.ID==s);

//立即加载此短消息的发送者属性内容

m.SenderReference.Load();

//输出发送者的名字

TextBox1.Text=m.Sender.Name;

 

 

如果你要同时加载多个用户,并将每个用户的短消息都加载出来,只需要先获得用户对象集合,然后遍历每个用户,分别执行.MsgsReference.Load()即可;无需在查询中涉及短消息表。

 

如有不明白的可以到我博客给我短信,我最近也是刚开始研究这个:)

斯克迪亚 | 老鸟四级 |园豆:4124 | 2009-06-09 01:56
其他回答(2)
0

不是太了解你的问题,能否用代码展示一下,使用注释说明何处出现何种错误?

Gray Zhang | 园豆:17610 (专家六级) | 2009-06-08 19:24
0

答非所问.

唐扬名 | 园豆:404 (菜鸟二级) | 2012-08-23 15:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册