生活随笔
收集整理的這篇文章主要介紹了
Linq表达式和Lambda表达式用法对比
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
什么是Linq表達式?什么是Lambda表達式?
前一段時間用到這個只是,在網(wǎng)上也沒找到比較簡單明了的方法,今天就整理了一下相關(guān)知識,有空了再仔細研究研究
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表達式更加優(yōu)雅
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表達式必須需要括號包裹起來才能取結(jié)果集
//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需要傳四個參數(shù)表達式,是不是有點暈了。。。
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需要區(qū)分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的程序員。
聯(lián)接查詢(內(nèi)聯(lián)、左聯(lián)、交叉聯(lián))
關(guān)于聯(lián)接查詢使用Linq會更合適一些這個上面已經(jīng)說了。
接下來我們寫內(nèi)聯(lián)、左聯(lián)、交叉聯(lián)的Linq和對應的Lambda代碼。(目的:可能有些人不會,同時在這里也給自己做個備忘)
內(nèi)聯(lián):
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();
?
左聯(lián):
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();
?
交叉聯(lián):
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
轉(zhuǎn)載于:https://www.cnblogs.com/chunhui212/p/5899158.html
總結(jié)
以上是生活随笔為你收集整理的Linq表达式和Lambda表达式用法对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。