首页 新闻 会员 周边

【999】 EF6.0 外键关联查询问题

0
悬赏园豆:40 [已解决问题] 解决于 2015-12-22 16:20

请教几个EF的问题。
我通过EF进行关联查询,Code first模式
实体建立好一直,如何关联查询呢?

目的就是为了翻译字典表

比如,我查询用户信息表SysUser,里面有一个状态属性State (int)
另外建立一个字典表SysUserStateDic 来存放状态,一共两列,ID、UserStateName
我在查询的时候输出,如何将SysUser里面的State翻译输出UserStateName列的内容?
百度了很多关系映射。
看的不是很明白,而且很多都是复制的同一个人的。

LiGoper的主页 LiGoper | 初学一级 | 园豆:32
提问于:2015-12-21 16:14
< >
分享
最佳答案
1

首先,在EF里要有外键关联

然后,在SysUser上用Include把SysUserStateDic加载进来既可以了。

收获园豆:20
狂乱の貴公子 | 菜鸟二级 |园豆:262 | 2015-12-21 16:47
其他回答(2)
1
var q= from c in dbcontext.sysuser
           join d in dbcontext.sysuserstatedic
           on c.state equals d.id
           select new {
           c.id, 
           ...
           c.state,
           d.statename
           }
收获园豆:10
爱编程的大叔 | 园豆:30839 (高人七级) | 2015-12-21 16:28

只能通过linq来查询吗?

6.0里面不能够自动映射出来吗?

支持(0) 反对(0) LiGoper | 园豆:32 (初学一级) | 2015-12-21 16:35

@愤怒的TryCatch: 你使用的词汇让人更加迷糊。

不要用你所以为的专业词汇,就说你想怎样得到结果吧。举例说明也行。Don't make me think.

支持(1) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2015-12-22 15:46

@爱编程的大叔: 

对不起,大叔,我问题没有描述清楚。

这里起始就是一个联表查询的问题。我最终选择了用Include来联表。

多谢大叔的指正

支持(0) 反对(0) LiGoper | 园豆:32 (初学一级) | 2015-12-22 16:20
1

对于你的这个问题,是有问题的,首先,你返回的类型你没有说,如果你要返回的是SysUser类型的话,那么UserStateName的值放在哪里返回给你 ,按你的问题我的理解是放在State里面,这个问题很严重的,因为这样就相当于State的值被修改了,那么你下次SaveChanges的时候,ef会把你的state值给你改到数据库里面,这不是你想要的吧,难道你在下次保存的时候,还要再把statename转成state??

正统的做法是做一个viewmodel,或者是结果model。比如:

1         public class Result
2         {
3             public Models.SysUser User { get; set; }
4             public string StateName { get; set; }
5         }

之所以不是在你的model里面加一个statename属性,是为了保证你的model数据库的一一对应关系尽量不被破坏。当你有了上面这个类(这个类不被映射到数据库,只是一个内存中使用的类),你的查询可以这样写:

1             using (Models.DbStock db = new Models.DbStock())
2             {
3                 var result = from u in db.SysUsers
4                              join s in db.SysUserStateDics
5                              on u.state equals s.ID
6                              select new Result() { User = u, StateName = s.UserStateName };
7                 List<Result> listusers = result.ToList();
8             }

listusers包含了每一个user以及它所对应的statename,当然,如果你不想用这个类,想用dictionary也是可以的,不过,还是建议使用一个新的类。

收获园豆:10
ensleep | 园豆:1682 (小虾三级) | 2015-12-21 17:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册