背景

今天处理一个问题时,遇到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个参数:

名称 说明
System_CAPS_pubmethodSystem_CAPS_static Join<TOuter, TInner, TKey, TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter, TKey>>, Expression<Func<TInner, TKey>>, Expression<Func<TOuter, TInner, TResult>>)

基于匹配键对两个序列的元素进行关联。使用默认的相等比较器对键进行比较。

System_CAPS_pubmethodSystem_CAPS_static Join<TOuter, TInner, TKey, TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter, TKey>>, Expression<Func<TInner, TKey>>, Expression<Func<TOuter, TInner, TResult>>, IEqualityComparer<TKey>)

基于匹配键对两个序列的元素进行关联。使用指定的IEqualityComparer<T> 对键进行比较。

每个参数具体能传入一些什么内容我也不完全理解,针对我这里的使用,说明如下:

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

发表评论

邮箱地址不会被公开。 必填项已用*标注