科普一下:
語言集成查詢(Language INtegrated Query,LINQ)
是一項微軟技術,新增一種自然查詢的SQL語法到.NET Framework的編程語言中,可支持Visual Basic .NET以及C#語言。
LINQ定義了大約40個查詢操作符,如select、from、in、where以及order by(C#中)。
使用這些操作符可以編寫查詢語句。不過,這些查詢還可以基於很多類型的數據,每個數據類型都需要一個單獨的LINQ類型。
基礎語法:
1)from 臨時變量 in 實現IEnumerable<T>接口的對象
where條件表達式
[orderby條件]
[group by 條件]
select 臨時變量中被查詢的值
2) 實現IEnumerable接口的對象.LINQ方法名(lambda表達式)。如:
string input = "hellow world";
int count = input.Count(w=>w == 'o'); //查詢字母o出現的次數
能夠使用LINQ的對象需要實現IEnumerable<T>接口。並且LINQ的查詢表達式是在一次創建對象時才被編譯的。
注意:Linq是在.NET Framework 3.5 中出現的技術,所以在創建新項目的時候必須要選3.5或者更高版本,否則無法使用。
選擇3.5或更高版本的.NET Framework之後,創建的新項目中會自動包含System.Linq的命名空間。
接著看代碼實現:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LINQ
{
public class Category
{
public int Age { get; set; }
public string Prase { get; set; }
}
public class Program
{
static void Main(string[] args)
{
//對數據集合的操作
List<string> names = new List<string> { "Tom", "Jack", "Jim", "Jackson", "Key", "Kitty" };
var nameJ = from n in names where n.StartsWith("J") orderby n select n;
foreach (var name in nameJ)
{
Console.WriteLine(name);
}
Console.WriteLine("-------------------------");
names.Add("Jack1");
names.Add("Jack2");
names.Add("Jack3");
foreach (string name in nameJ)
{
Console.WriteLine(name);
}
Console.WriteLine("-------------------------");
List<Category> cs = new List<Category>() {
new Category{Age=22,Prase="13期"},new Category{Age=22,Prase="12期"},new Category{Age=22,Prase="14期"},
new Category{Age=23,Prase="14期"},new Category{Age=20,Prase="13期"},new Category{Age=24,Prase="14期"},
new Category{Age=25,Prase="14期"},new Category{Age=23,Prase="13期"},new Category{Age=25,Prase="14期"}
};
var s = (from s1 in cs where s1.Age > 21 && s1.Prase == "14期" orderby s1.Age descending select s1).Take(3);
foreach (var c1 in s)
{
Console.WriteLine(c1.Age + " " + c1.Prase);
}
Console.WriteLine("-------------------------");
var ss = from s1 in cs
group s1 by s1.Prase into c
orderby c.Count() descending, c.Key
where c.Count() >= 2
select c.Key + c.Count();
foreach (var s1 in ss)
{
Console.WriteLine(s1);
}
Console.WriteLine("-------------------------");
object[] data = { "hello",33,"what",36,"fine",39,"thanks"};
var str = data.OfType<string>();
foreach (var a in str)
{
Console.WriteLine(a);
}
Console.ReadKey();
}
}
}
上述代碼除了LINQ查詢語法外,其他都是我們所熟悉的語法,而LINQ查詢語法跟SQL查詢語法很相似,除了先後順序。
Q:為何 LINQ 查詢語法是以 from 關鍵字開頭的,而不是以 select 關鍵字開頭的?select 開頭這種寫法跟SQL的寫法更接近,更易懂呀?
A:簡單來說,為了IDE的智能感知(Intelisence)這個功能,select 關鍵字放在後面了。
其中的 into 關鍵字表示 將前一個查詢的結果視為後續查詢的生成器,這裡是跟 group by 一起使用的。
LINQ中的Group by不要跟 SQL 中的Group by 混淆,SQL由於是二維結構,Group by 的一些邏輯受二維結構的約束,無法像 LINQ 中的Group by 這麼靈活。
事實上,LINQ的查詢語法存在以下兩種形式:
查詢方法方式:(Methord Syntax)
主要利用System.Linq.Enumerable類中定義的擴展方法和Lambda表達式方式進行查詢
參考文檔:Lambda 表達式(C# 編程指南):https://msdn.microsoft.com/zh-cn/library/bb397687.aspx
查詢語句方式:(Query Syntax)一種更接近SQL語法的查詢方式,可讀性更好。
使用優點:
1、無需復雜學習過程即可上手
2、編寫更少代碼即可創建完整應用。
3、更快開發錯誤更少的應用程序。
4、無需求助奇怪的編程技巧就可合並數據源。
5、讓新開發者開發效率更高。
6、任何對象或數據源都可以定制實現Linq 適配器,為數據交互帶來真正方便。
支持以下公共語言運行時 (CLR) 方法和屬性,因為它們可以在查詢表達式中進行轉換以包含在OData服務的請求 URI 中:
1也支持Visual Basic中等效的Microsoft.VisualBasic.DateAndTime的日期和時間屬性以及DatePart方法。
客戶端或許還可以在客戶端上計算其他 CLR 函數。對於無法在客戶端上計算以及無法轉換為有效請求URI以便在服務器上計算的任何表達式,將引發 NotSupportedException。
參考文檔:在 C# 中編寫查詢 (LINQ):https://msdn.microsoft.com/zh-cn/library/bb397900(v=VS.90).aspx?lc=2052