一、創建數據
- (1)、數據源1
- (2)、數據源2
二、普通使用方法 - (1)ALL 和 ANY
bool allChina = products.All(p => p.Region == "中國");//所有項Region都要是中國,結果:False
bool anyChina = products.Any(p => p.Region == "中國");//某一項Region是中國,結果:True
- (2)聚集
int countIdGreater5 = products.Count(p => p.ID > 5);//ID大於5的記錄數,結果:4
decimal maxPrice = products.Max(p => p.Price);//金額最高,結果:208000
int minId = products.Min(p => p.ID);//編號最小,結果:1
decimal avgPrice = products.Average(p => p.Price);//金額平均值,結果:53538
decimal sumPrice = products.Sum(p => p.Price);//金額總值 結果:481842
- (3)累加器
Product aggregate1 = products.Aggregate((total, next) =>//累加器,對products中每一個元素執行一次Func
{
total.Price += next.Price;
return total;
});
- (4)SELECT
string[] select1 = products.Select(p => p.Name).ToArray();//選擇單列,可以轉換成數組
var select2 = products.Select(p => new { p.ID, p.Name }).ToDictionary(d => d.ID);//選擇兩列,可以轉換成鍵值對
var selectMore = products.Select(p => new { p.ID, p.Name, p.Price }).ToList();//選擇多列,可以轉換成對象
//鍵值對必須要保證鍵值是唯一的,在鍵值不唯一的情況可以使用ToLookup方法
var lookup = products.ToLookup(l => l.IsFavorite, p => new { p.ID, p.Name, p.Region, p.Price }).ToList();
lookup.ForEach(l =>
{
Console.WriteLine(l.Key ? "已收藏" : "未收藏");
l.ToList().ForEach(item => Console.WriteLine("\t{0}\t{1}\t{2}\t{3}", item.ID, item.Name, item.Region, item.Price));
});
- (5) ORDER BY
var rightOrder = products.OrderBy(p => p.IsFavorite).ThenByDescending(p => p.ID).ToList();//主IsFavorite,次ID
var errorOrder = products.OrderBy(p => p.IsFavorite).OrderByDescending(p => p.ID).ToList();//主ID,次IsFavorite
- (6) GROUP BY
var group = products.GroupBy(p => p.IsFavorite).Select(g => new { IsFavorite = g.Key, SumPrice = g.Sum(item => item.Price), CountItem = g.Count() }).ToList();
- (7) WHERE
List<Product> distinct = products.Distinct().ToList();//去掉重複的記錄
List<Product> take = products.Take(3).ToList();//順序取3條記錄
List<Product> takeWhile = products.TakeWhile(p => p.ID <= 4).ToList();//只要不滿足條件了,返回所有當前記錄
List<Product> skip = products.Skip(3).ToList();//順序跳過3條記錄
List<Product> skipWhile = products.SkipWhile(p => p.Price < 100000).ToList();//只要不滿足條件了,返回所有剩餘記錄
List<Product> contains = products.Where(p => p.Name.Contains("紅")).ToList();//包含“紅”的集合
Product first = products.Where(p => p.Name.StartsWith("大")).First();//“大”開頭的第一條記錄 如果無記錄,直接報異常
Product lastDefault = products.Where(p => p.Name.EndsWith("胡")).LastOrDefault();//“胡”結尾的最後一條記錄 如果無記錄,返回默認值(對象返回null)不會報異常
Product single = products.Where(p => p.ID == 1).SingleOrDefault();//取單條記錄,有多條時會報異常
Product elementDefault = products.ElementAtOrDefault(10);//返回第10條記錄 如果沒有第10條記錄,返回默認值(對象返回null)不會報異常
- (8)默認值
products.DefaultIfEmpty(new Product { ID = 999, Name = "默認產品", Region = "默認地區", Price = 0 });//判斷是否爲空,是返回默認值,否返回products
(三)複雜使用方法
- (1)JOIN
//兩表內聯,結果有2條記錄
var joinTable = table1.AsEnumerable().Join(table2.AsEnumerable(),
left => left["ID"].ToString(),
right => right["ID"].ToString(),
(left, right) => new {
LeftID = left["ID"].ToString(),
RightID = right["ID"].ToString(),
LeftName = left["Name"].ToString(),
RightName = right["Name"].ToString() }).ToList();
joinTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}\t{3}", t.LeftID, t.RightID, t.LeftName, t.RightName));
- (2)GROUPJOIN
//以第一個表爲基準,對第二個表進行分組
var groupJoinTable = table1.AsEnumerable().GroupJoin(table2.AsEnumerable(),
left => left["Description"].ToString(),
right => right["Description"].ToString(),
(key, g) => new {
Key = key["Description"].ToString(),
Count = g.Count(),
TotalAmount = g.Where(s => decimal.Parse(s["Amount"].ToString()) > 20).Sum(s => decimal.Parse(s["Amount"].ToString()))
}).ToList();
groupJoinTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}", t.Key, t.Count, t.TotalAmount));
- (3)比較兩個表是否相等
bool isEqual = table1.AsEnumerable().Where(t => t["ID"].ToString() == "1")
.SequenceEqual(table2.AsEnumerable().Where(t => t["ID"].ToString() == "1"), DataRowComparer.Default);
Console.WriteLine(isEqual);
- (4)連接兩個表,不去重複,列取公共部分
var concatTable = table1.AsEnumerable().Concat(table2.AsEnumerable()).ToList();
concatTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}\t{3}", t["ID"], t["Name"], t["Amount"], t["Description"]));
- (5)差集、交集、並集
//兩表的差集
var exceptTable = table1.AsEnumerable().Except(table2.AsEnumerable(), DataRowComparer.Default).ToList();
exceptTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}\t{3}", t["ID"], t["Name"], t["Amount"], t["Description"]));
//兩表的交集
var intersectTable = table1.AsEnumerable().Intersect(table2.AsEnumerable(), DataRowComparer.Default).ToList();
intersectTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}\t{3}", t["ID"], t["Name"], t["Amount"], t["Description"]));
//兩表的並集
var unionTable = table1.AsEnumerable().Union(table2.AsEnumerable(), DataRowComparer.Default).ToList();
unionTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}\t{3}", t["ID"], t["Name"], t["Amount"], t["Description"]));
參考地址:https://blog.csdn.net/sjb2mln/article/details/76686832