LINQ 語法筆記

  • 2677
  • 0
  • 2018-05-31

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" ? "停用" :
						   ""
			};