1、笔记
2、数据库为 Oracle 11g
3、linq to entities 技术
4、实现效果
- join 和 group by组合使用
- 多列表字段值合并到一列
- 分组,将 “不同值列” 多行值拼接到一行
public IEnumerable<BookingOrderDetail> GetBookingOrderDetailByNo(string orderNo)
{
using (var db = new Entities())
{
//连接分组(join——inner join,Group by)
var query = from bo in db.BOOKING_ORDER
join bod in db.BOOKING_ORDER_DETAIL
on bo.BOOKING_ORDER_ID equals bod.BOOKING_ORDER_ID
where (bo.ORDER_NO.ToUpper() == orderNo.ToUpper())
group new { bo, bod } by new { bo.BOOKING_ORDER_ID, bo.LOCAL_COMPANY_NAME_CN, bo.SHIP_NAME_EN, bo.VOYAGE, bo.STATUS, bo.ORDER_NO, bod.CONTA_SIZETYPE_CODE } into g
select new
{
Booking_Order_ID = g.Key.BOOKING_ORDER_ID,
Local_Company_Name_CN = g.Key.LOCAL_COMPANY_NAME_CN,
Ship_Name_EN = g.Key.SHIP_NAME_EN,
Voyage = g.Key.VOYAGE,
Status = g.Key.STATUS,
Order_No = g.Key.ORDER_NO,
CONTA_SIZETYPE_CODE = g.Key.CONTA_SIZETYPE_CODE,
Count = g.Select(x => x.bod.CONTA_SIZETYPE_CODE).Count()
};
//例子,表结构如下:
//student 学生表
//sid sname sage
//1 张三 18
//2 李四 19
//achievement 成绩表
//aid ctype(科目id,外键) sid(外键——学生id) score(分数)
//1 1 1
//2 2 1
//3 3 1
//4 1 2
//5 2 2
//列合并,将多列的值合并到一列
var query1 = from i in query.ToList()
select new
{
Booking_Order_ID = i.Booking_Order_ID,
Local_Company_Name_CN = i.Local_Company_Name_CN,
Ship_Name_EN = i.Ship_Name_EN,
Voyage = i.Voyage,
Status = i.Status,
Order_No = i.Order_No,
CONTA_SIZETYPE_CODE = string.Join("×", i.CONTA_SIZETYPE_CODE, i.Count)
};
//执行query块,结果
//sid sname sage ctype ccount(参考总科目数量)
//1 张三 18 1 1(考了一门语文)
//1 张三 18 2 1(考了一门数学)
//1 张三 18 3 1(考了一门英语)
//行合并,将多行的值用“,”拼接起来
var query2 = from i in query1.ToList()
group i by new { i.Booking_Order_ID, i.Local_Company_Name_CN, i.Ship_Name_EN, i.Voyage, i.Status, i.Order_No } into tempGroup
//select new
//{
// Booking_Order_ID = tempGroup.FirstOrDefault().Booking_Order_ID,
// Local_Company_Name_CN = tempGroup.FirstOrDefault().Local_Company_Name_CN,
// Ship_Name_EN = tempGroup.FirstOrDefault().Ship_Name_EN,
// Voyage = tempGroup.FirstOrDefault().Voyage,
// Status = tempGroup.FirstOrDefault().Status,
// Order_No = tempGroup.FirstOrDefault().Order_No,
// CONTA_SIZETYPE_CODE = string.Join(",", (tempGroup.Select(s => s.CONTA_SIZETYPE_CODE)).ToList())
//};
select new BookingOrderDetail() { //如果返回集合的话,注意不能返回匿名对象,必须如这种写法
Booking_Order_ID = 0
//省略
};
//执行query1块,结果
//sid sname sage ctype
//1 张三 18 1 × 1
//1 张三 18 2 × 1
//1 张三 18 3 × 1
return query2;
}
}