Linq表達式和Lambda表達式用法對比


什么是Linq表達式?什么是Lambda表達式?
前一段時間用到這個只是,在網上也沒找到比較簡單明了的方法,今天就整理了一下相關知識,有空了再仔細研究研究

public Program()
{
List<Student> allStudent = new List<Student> {
new Student("張三",23),
new Student("李四",29),
new Student("王二",25),
new Student("趙六",26)
};
//Ling表達式
var stus1 = from s in allStudent
where s.Name == "王二"
select new { s.Name, s.Age };
//Lanmbda表達式
var stus2 = allStudent.Where(t => t.Name == "王二").Select(t => new { t.Name, t.Age });
}

public class Student
{
public string Name { set; get; }
public int Age { set; get; }
public Student(string name, int age)
{
this.Name = name;
this.Age = age;
}
}
Lambda確實比Linq表達式更加優雅
Linq表達式的select不能省略
//Linq
var students1 = from t in db.Students
where t.Name == "張三"
select t;
//Lambda
var students2 = db.Students
.Where(t => t.Name == "張三");

Linq表達式必須需要括號包裹起來才能取結果集
//Linq
var students1 = (from t in db.Students
where t.Name == "張三"
select t).ToList();
//Lambda
var students2 = db.Students
.Where(t => t.Name == "張三")
.ToList();

 

什么時候使用Linq?
通過上面的對比,好像Linq一文不值了。no,不是這樣的。
比如下面幾種情況我們就可以選擇使用Linq:
例一:(本例適用於Linq to Object 和 沒有建主外鍵的EF查詢)
Lambda中的Join需要傳四個參數表達式,是不是有點暈了。。。

var list1 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "張三" }, { "4", "張三" } };
var list2 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "李四" }, { "4", "張三" } };

//Linq
var obj1 = from l1 in list1
join l2 in list2
on l1.Key equals l2.Key
select new { l1, l2 };
//Lambda
var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 });

 

例二:
Lambda需要區分OrderBy、ThenBy有沒有覺得麻煩

//Linq
var obj1 = from l1 in list1
join l2 in list2
on l1.Key equals l2.Key
orderby l1.Key, l2.Key descending
select new { l1, l2 };
//Lambda
var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 })
.OrderBy(li => li.l1.Key)
.ThenByDescending(li => li.l2.Key)
.Select(t => new { t.l1, t.l2 });

 


總覺得Linq更多的只是為了照顧那些寫慣了sql的程序員。

聯接查詢(內聯、左聯、交叉聯)

關於聯接查詢使用Linq會更合適一些這個上面已經說了。
接下來我們寫內聯、左聯、交叉聯的Linq和對應的Lambda代碼。(目的:可能有些人不會,同時在這里也給自己做個備忘)
內聯:

var list1 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "張三" }, { "4", "張三" } };
var list2 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "李四" }, { "4", "張三" } };
//Linq查詢
var ojb2 = (from l1 in list1
join l2 in list2
on l1.Key equals l2.Key
select new { l1, l2 }).ToList();
//Lambda查詢
var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 }).ToList();

 

左聯:

var list1 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "張三" }, { "4", "張三" } };
var list2 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "李四" }, { "4", "張三" } };
//Linq查詢
var ojb2 = (from l1 in list1
join l2 in list2
on l1.Key equals l2.Key into list
from l2 in list.DefaultIfEmpty()
select new { l1, l2 }).ToList();
//Lambda查詢
var obj = list1.GroupJoin(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2=l2.FirstOrDefault() }).ToList();

 

交叉聯:

var list1 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "張三" }, { "4", "張三" } };
var list2 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "李四" }, { "4", "張三" } };
//Linq查詢
var ojb2 = (from l1 in list1
from l2 in list2
select new { l1, l2 }).ToList();
//Lambda查詢
var obj = list1.SelectMany(l1 => list2.Select(l2 => new { l1,l2})).ToList();

 

FROM :http://www.cnblogs.com/zhaopei/p/5746414.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM