LINQ (Language Integrated Query) 是 .NET 3.5 的里程碑功能,而 LINQ to SQL 只是其眾多 Provider 之一。要駕馭 LINQ 查詢語法,必須先精通 C# 3.0 引入的六大語法糖:隱含型別變數、匿名型別、擴充方法、自動屬性、物件/集合初始化器、Lambda 運算式。本文逐一解析並給出實戰範例,為後續 LINQ 學習鋪路。
var age = 26;
var username = "zhuye";
var userlist = new [] { "a", "b", "c" };
foreach (var user in userlist) Console.WriteLine(user);
var data = new { username = "zhuye", age = 26 };
Console.WriteLine($"username:{data.username} age:{data.age}");
public static class StringHelper
{
public static string MD5Hash(this string s)
=> FormsAuthentication.HashPasswordForStoringInConfigFile(s, "MD5");
public static bool In(this object o, IEnumerable source)
=> source.Cast<object>().Any(item => item == o);
}
// 呼叫
"123456".MD5Hash();
"1".In(new[] { "1", "2", "3" });
thispublic class Person
{
public string Username { get; protected set; }
public int Age { get; set; }
public Person() { Username = "zhuye"; }
}
var p = new Person { Username = "zhuye", Age = 26 };
// 等同於
var p = new Person(); p.Username = "zhuye"; p.Age = 26;
var list = new List<Person> {
new Person { Username = "a", Age = 1 },
new Person { Username = "b", Age = 2 }
};
(參數列表) => 運算式或語句區塊
var list = new[] { "aa", "bb", "ac" };
var result = Array.FindAll(list, s => s.IndexOf("a") > -1);
// 等同 delegate(string s) { return s.IndexOf("a") > -1; }
public delegate int MyDg(int a, int b);
public static class LambdaTest
{
public static int Oper(this int a, int b, MyDg dg) => dg(a, b);
}
Console.WriteLine(1.Oper(2, (a, b) => a + b)); // 3
Console.WriteLine(2.Oper(1, (a, b) => a - b)); // 1
var persons = new List<Person> {
new Person { Username = "a", Age = 19 },
new Person { Username = "b", Age = 20 },
new Person { Username = "a", Age = 21 }
};
var q = from p in persons
where p.Age >= 20
select p.Username.ToUpper();
掌握這六大特性,即擁有駕馭 LINQ to SQL、LINQ to XML、LINQ to Objects、PLINQ 等所有 LINQ 風味的通用鑰匙。下一篇正式進入 LINQ to SQL 實戰查詢語法篇。