Linq查詢大全

1)。查詢執行的時機
 
1.查詢分爲以下三步:獲取數據源、定義查詢、執行查詢;
2.定義查詢後,查詢直到需要枚舉結果時才被真正執行,這種方式稱爲“延遲執行(deferred execution)”;
3.當查詢方法返回單一值時,查詢立即執行;
因此,可以通過以下技巧在定義查詢時就強制執行查詢
var even = numbers
.Where(p => p % 2 == 0)
.Select(p =>
{
Console.WriteLine("Hi! " + p.ToString());
return p;
}).Count();
 
2)。 LINQ查詢存在以下兩種形式
 
1. Method Syntax, 查詢方法方式
主要利用 System.Linq.Enumerable 類中定義的擴展方法和 Lambda 表達式方式進行查詢
2. Query Syntax, 查詢語句方式
一種更接近 SQL 語法的查詢方式
可讀性更好
      
//查詢語句
int[] numbers = new int[] { 6, 4, 3, 2, 9, 1, 7, 8, 5 };
var even = from number in numbers
where number % 2 == 0
orderby number descending
select number;
 
//查詢方法
int[] numbers = new int[] { 6, 4, 3, 2, 9, 1, 7, 8, 5 };
var even = numbers
.Where(p => p % 2 == 0)
.OrderByDescending(p => p)
.Select(p => p);
 
兩者的執行效果完全一樣;
 
3)。 查詢語句vs查詢方法
     
查詢語句與查詢方法存在着緊密的關係
CLR本身並不理解查詢語句,它只理解查詢方法
編譯器負責在編譯時將查詢語句翻譯爲查詢方法
大部分查詢方法都有對應的查詢語句形式:如 Select() 對應 select 、 OrderBy() 對應 orderby
部分查詢方法目前在C#中還沒有對應的查詢語句:如 Count()和Max() 這時只能採用以下替代方案
查詢方法
查詢語句 + 查詢方法的混合方式;
一般情況下,建議使用可讀性更好的查詢語句
高級查詢方法:
 
聚合類:
Count,Max/Min,Average
排序類:
ThenBy
分區類:
Take,TakeWhile,Skip,SkipWhile
集合類:
Distinct
生成類:
Range, Repeat
 
 
4)。聚合類查詢方法
     
Count     返回集合項的數目
Max/Min  返回集合中的最大值/最小值
Average   返回集合的平均值
Sum      返回集合的總和
 
示例:int count = (from p in foxRiver8
where p.Age <= 30
select p).Count();  (其他情況類似)
 
5) . 排序類查詢方法
     
ThenBy  提供複合排序條件 
注意:ThenBy查詢方法屬於查詢方法語句所有;查詢語句使用orderby排序;
 
//查詢方法
示例:var q = foxRiver8
.OrderBy(p => p.FirstName)
.ThenBy(p => p.LasName)
.ThenBy(p => p.Age);
 
//查詢語句
示例: var q = from p in foxRiver8
orderby p.FirstName, p.LasName, p.Age
select p;
 
6) . 分區類查詢方法
 
Take      提取指定數量的項
Skip      跳過指定數量的項並獲取剩餘的項
TakeWhile 根據指定條件提取項
SkipWhile 根據指定條件跳過項
 
示例:int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var q = numbers.Skip(1).Take(3);
foreach (var item in q)     跳過前1條記錄,連續提取3條記錄,得到2,3,4
{
   Console.WriteLine(item);
}
 
示例: int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var q = numbers.SkipWhile(i => i % 3 != 0)
.TakeWhile(i => i % 2 != 0);
foreach (var item in q)
{
   Console.WriteLine(item);
}
 
7) . 集合類查詢方法
     
Distinct   去掉集合中的重複項
 
示例: int[] factorsOf300 = { 2, 2, 3, 5, 5 };
var uniqueFactors = factorsOf300.Distinct();   輸出2,3,5
 
8) . 生成類查詢方法
 
Range        生成一個整數序列
Repeat       生成一個重複項的序列
 
示例:var numbers =Enumerable.Range(1, 10);
foreach (var item in numbers)
{                                                            生成1-10的數字
   Console.WriteLine(item);
}
 
示例:var numbers =Enumerable.Repeat(“Beijing 2008”, 10);
foreach (var item in numbers)
{                                                            生成10個” Beijing 2008”
Console.WriteLine(item);
}
 
使用生成類查詢方法時,需要注意以下幾點:
和其他幾類方法不同,Range/Repeat 不是擴展方法,而是普通的靜態方法
Range 只能產生整數序列
Repeat 可以產生泛型序列
所有的查詢方法都存放在 System.Linq.Enumerable 靜態類中
 
9) . Cast<T>方法
     
如果數據集合是ArrayList類型的怎麼辦?ArrayList只是實現了IEnumerable接口,並沒有實現IEnumerable<TSource>這個泛型接口,那麼,就無法使用IEnumerable<TSource>的擴展方法了,這個時候,可以使用Cast<T>()方法進行轉換;
     
示例: ArrayList posts=new ArrayList{
new post{id=1,attach=“a.txt”},
new post(id=2,attach=“b.xsl”),
new post(id=3,attach=“c.pdf”)}
var dataSource = from post in posts.Cast<Post>()
             where post.UserName == userName
             select post.Title;
 
Cast<T>方法如果遇到元素是null,則可能拋出異常或返回null,可以採用OfType<T>()方法,這樣會過濾掉null元素;
 
示例:ArrayList posts=new ArrayList{
new post{id=1,attach=“a.txt”},
new post(id=2,attach=“b.xsl”),
new post(id=3,attach=“c.pdf”)}
var dataSource = from post in posts.OfType<Post>()
             where post.UserName == userName
             select post.Title;
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章