使用Queryable.Join实现多表连接查询
背景
今天处理一个问题时,遇到EF Model中多表连接查询的情况,于是学习了一下Queryable.Join()的用法。由于本人是Linq新手,很多地方都看不懂,只能依葫芦画瓢。
业务说明
1) 一个EF Model名为Daks,对应的DbContext名为DaksContext
2) 此处要进行Field表(Id, FieldName,…)和Reservoir表(Id, FieldId, Reservoir Code, FieldCode, Resource,… )的关联查询,Reservoir.FieldId是外键对应Field.Id
3) 将两张表的部分列数据查询出来放入实体类UpdatedReservoir中
代码示例
DaksContext dc = new DaksContext(); List<UpdatedReservoir> toReservoirs = dc.Reservoirs .Join(dc.Fields, r => r.FieldId, f => f.Id, (r, f) => new UpdatedReservoir() { SqlServerFieldId = r.FieldCode, SqlServerReservoirCode = r.OriginalReservoirCode, SqlServerUniqueName = f.FieldName + "(" + r.ReservoirUnit + ")" + "(" + r.Resource + ")" }) .OrderBy(i => i.SqlServerUniqueName) .ToList();
代码解释
这里Join()方法有4个参数:
每个参数具体能传入一些什么内容我也不完全理解,针对我这里的使用,说明如下:
1) 首先使用dc.Reservoirs得到Reservoir表的集合
2) 再调用Join方法,
2.1) 第一个参数,传入外连表Field表的集合
dc.Fields
2.2) 第二个参数,主表外键字段信息,这里r是Reservoir表实例
r=>r.FieldId
2.3) 第三个参数,外连表字段信息,这里f是Field表实例
f=>f.Id
2.4) 第四个参数,输出结果,将两张表中部分自动的信息封装成UpdatedReservoir类
(r, f) => new UpdatedReservoir() { SqlServerFieldId = r.FieldCode, SqlServerReservoirCode = r.OriginalReservoirCode, SqlServerUniqueName = f.FieldName + "(" + r.ReservoirUnit + ")" + "(" + r.Resource + ")" }
3) 最后,设置排序规则,这里是对输出结果UpdatedReservoir类的自动进行排序,这里i是UpdatedReservoir类实例
.OrderBy(i => i.SqlServerUniqueName) .ToList();
两个参考链接
https://msdn.microsoft.com/zh-cn/library/system.linq.queryable.join(v=vs.110).aspx
http://www.ezineasp.net/post/C-Sharp-LINQ-Queryable-Join-Method-in-ASP-Net.aspx