1. Like ('%A%') TSQL like 'A%' TSQL like '%A'
2.Count()
3.Sum()
4.Any()、All()。
5.skip()、Take()
6.Concat() 、Union()
6.ToLookup
7.子查詢 & case when
1.T-SQL Like
//like '%AL%'
var query = from a in APs.AsQueryable()
where a.APID.Contains("AL")
select a.APID;
query.Dump();
//like 'AL%'
var query_2 = from a in APs.AsQueryable()
where a.APID.StartsWith("AL")
select a.APID;
query_2.Dump();
//like 'AL%'
var query_3 = from a in APs.AsQueryable()
where a.APID.EndsWith("M")
select a.APID;
query_3.Dump();
執行結果,在LINQPad裡面轉成T-SQL
2.Count()
var query = from p in EMPMASTs.AsQueryable() select p;
//所有的資料
query.Count().Dump();
//加入條件 DEPTID=900
query.Count(p=>p.DEPTID == "900").Dump();
//Count() 加入兩個條件
query.Count(p=>p.DEPTID == "900" && p.SIGNID <= 40).Dump();
執行結果如下:
3.Sum()
//如果查詢的物件內有兩個以上的欄位,在Sum的時候需要明確指定哪一個欄位作家總
var query = from p in RANKs.AsQueryable() where p.RANKID < 16 select p;
query.Dump();
query.Sum(p => p.RANKID).Dump();
//如果查詢的物件只有一個數字型態的欄位,在SUM的時候不需要指定哪一個欄位(也不能指定)
var query_2 = from p in RANKs.AsQueryable() where p.RANKID < 16 select p.RANKID;
query_2.Dump();
query_2.Sum().Dump();
執行結果如下:
4.Any()、All()
在使用Any() 之前先弄清楚導覽屬性
Table:Orders 有一個導覽屬性:OrderLines ,由下圖(1) 可看到,這個圖是表示Table:Orders 跟 Table:OrderLines 是一對多的關係
查詢結果,點開後如下圖(2)
比較Any() 跟All() 的差別,
使用Any() 去查詢導覽屬性 OrderLines對應過去的資料,
(from p in Orders.AsQueryable()
where p.OrderLines.Any(x=>x.Qty < 50)
orderby p.OrderId
select p).Dump();
下圖為執行結果
OrderID = 1 的資料透過導覽屬性對應到Table:OrderLine 有五筆資料,條件Qty<50 ,
在Any() 內查詢的用法是,這五筆資料只要有一筆資料Qty <50 ,條件就成立。
All()的用法
相同的LINQ語法,把Any() 改為 All()
(from p in Orders.AsQueryable()
where p.OrderLines.All(x => x.Qty < 50)
orderby p.OrderId
select p).Dump();
執行結果如下:
可看到在Any()的時候有取出的資料OrderID=1,在All()這邊就沒有撈到,
All()的意思是,透過導覽屬性對應到Table:OrderLine,對應到的多筆資料必須條件全部符合(Qty<50)
5.skip()、Take()
//所有資料
(from d in Departments
orderby d.DepartmentID
select d ).Dump();
//取得兩筆資料(Take)
(from d in Departments
orderby d.DepartmentID
select d).Take(2).Dump();
//先跳過2筆資料,再取得2筆資料
(from d in Departments
orderby d.DepartmentID
select d).Skip(2).Take(2).Dump();
執行結果如下:
6.ToLookup:
依照指定的欄位將資料分組,跟GroupBy會 延遲執行 (Deffered Execution),
//依OrderID 做分類
var query = (from p in OrderLines select p).ToLookup(x => x.OrderId);
foreach (var order in query)
{
//只取OrderID == 2 的印出來
if (order.Key == 2)
{
foreach (var item in order)
{
("OrderID:" + item.OrderId + ",LineNumber:" + item.LineNumber + ",ProductID:" + item.ProductId).Dump();
}
}
}
執行結果如下:
6.Concat() 、Union():
Concat 會列出重複的,Union則不會
7.子查詢 & case when
var query = from p in SYS_BusiSystems.AsQueryable()
// 子查詢,先在這邊把資料找出來
let SGroupName = (from k in SYS_ITGroupSWs
where k.SGroupSN == p.SGroupSN
select k.SGroupID + "." + k.SGroupName).FirstOrDefault()
select new
{
//將子查詢結果塞到select new 裡面
SGroupName = SGroupName,
// case when 的用法
IsActive = p.IsActive == "1" ? "啟用" :
p.IsActive == "0" ? "停用" :
""
};