一、集合的常用擴展方法(lambda的方式)
1.Where() 根據條件選擇數據
2.Select() 根據數據條件轉換成新的數據類型,類似于DTO轉換類
3.Max() 根據條件選擇最大值
4.Min() 根據條件選擇最小值
5.OrderBy() 根據條件升序排序
如果升序中Id都為1,那么就根據第二個條件進行升序排序,使用ThenBy
ThenByDescending()緊接著倒序排序
6.First() 獲取第一個(如果不存在則報錯)
7.FirstOrDefault() 獲取第一個,如果不存在則返回null或默認值
8.Single() 獲取唯一一個,如果沒有或者多個則報異常
9.SingleOrDefault() 獲取唯一一個,如果沒有則返回默認值,如果多個則報錯
10.Any() 判斷集合中是否包含元素,如果有返回true,否則返回false。一般比Count效率高。因為Any()只要查詢到數據就返回,Count是統計數據的數量。Any還可以指定條件表達式。
11.Distinct() 去除重復數據
(1)int類型的集合:List。
(2)string類型的集合:List
(3)對于自定義類的集合去重復
使用Linq中Distinct方法內進行比較的是對象引用,判斷的是對象是否引用同一個對象,而不是對象的屬性。因此我們使用對象集合使用Distinct方法時要使用重載
Distinct(this IEnumerable source, IEqualityComparer comparer);
要使用這個方法,重寫IEqualityComparer接口,再使用Distinct方法:
由于直接獲取對象的HashCode,用HashCode進行比較的速度比Equals方法更快,因此IEqualityComparer內部會再使用Equals前先使用GetHashCode方法,再兩個對象的HashCode都相同時即判斷對象相同。
而當兩個對象HashCode不相同時,Equals方法就會被調用,對要比較的對象進行判斷。由于在List集合中兩個引用實際上是兩個不同的對象,因此HashCode必定不相同,所以要觸發Equals方法,只需要改GetHashCode,讓它返回相同的常量。
12.Skip(n)跳過前n條數據,Take(m)獲取最多m條數據,如果不足m條也不會報錯。
13.Except(item1) 排除當前集合中在item1中存在的數據。
如果是自定義集合,需要同Distinct方法一樣實現IEqualityComparer接口
14.Union(item1)把當前集合和item中元素組合(求并集)
自定義集合實現IEqualityComparer
15.Intersect(item1) 把當前集合和item中元素求交集
16.GroupBy() 分組(其中Key值是分組返回值)
按照string類型進行返回值
17.SelectMany() 把集合中每個對象的集合屬性的值重新拼接為一個新的集合(不能去除重復數據)
18.Join() 聯合查詢(可以查詢兩個表某個屬性相同的數據)
使用擴展方法,本人只找到添加一個條件查詢,沒有找到添加多個條件查詢,但是使用Linq方式的Join可以使用添加多個條件查詢。
二、Linq寫法
上面介紹的是lambda的方式寫的,下面介紹的是Linq的寫法。兩種方法可以相互替代,沒有哪個好哪個壞的區別。在編譯器編譯的時候,使用Linq的寫法最終都被編譯成了lambda的方式的寫法(通過反編譯工具可以看出)
建議:需要join等復雜用法的時候Linq更易懂,一般的時候lambda方式的寫法更清晰、緊湊。同時這兩種寫法可以混合書寫。
必須是:from 變量 in 集合,并且是select xxx結尾
1.Where(s=>s.Id>2)寫法:
2.Select(s=>new GetData(){Id=s.Id,Name=s.Name})寫法:
3.OrderBy(s=>s.Id). ThenBy(s=>s.Name.Length);寫法
4.Join聯合查詢(兩個集合的條件判斷相等不能使用”==”,而是使用equals)
一個條件的聯合查詢
多個條件查詢
5.group by 分組