linq与lambda的对比与简单使用

日期:2018-05-11 18:35:31 类别:  ASP.NET

linq和lambda写法都非常的优雅,他们基本是“互通的”,也就是说 能用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();