如图:html
因而可知Linq表达式和Lamdba表达式并无什么可比性。程序员
那与Lamdba表达式相关的整条语句称做什么呢?在微软并无给出官方的命名,在《深刻理解C#》中称为点标记。sql
因此,咱们的标题的提问根本就不合适。应该是“Linq查询表达式和点标记你更喜欢哪一个?”。如:ide
//查询表达式 var students1 = from t in db.Students where t.Name == "张三" select new { t.Id, t.Name, t.Age }; //点标记 var students2 = db.Students .Where(t => t.Name == "张三") .Select(t => new { t.Id, t.Name, t.Age });
我相信更多的人偏向选择点标记。具体什么缘由我也说不清(多是点标记中的Lamdba更加优雅吧)。对于我我的来讲,也是更加喜欢点标记这种方式。post
一、全部的查询表达式均可以转成对应的点标记。反之,不是全部的点标记均可以转成查询表达式。spa
为何?由于查询表达式在编译后就直接变成了点标记:(如下是上面两个语句对应的编译后的反编译C#代码).net
生成了如出一辙的代码。(因为是编译后的,好多乱七八糟的代码。咱们只看Where和Select关键字就知道,使用的都是点标记。)3d
二、点标记确实比查询表达式更加优雅code
例一:htm
//查询表达式 var students1 = from t in db.Students where t.Name == "张三" select t; //点标记 var students2 = db.Students .Where(t => t.Name == "张三");
我为何必定要 select t 啊,这句没卵用的废话就不能省吗?是的,省了就报错:
例二:
必须须要括号包裹起来才能取结果集?你还能更丑一点吗?
//查询表达式 var students1 = (from t in db.Students where t.Name == "张三" select t).ToList(); //点标记 var students2 = db.Students .Where(t => t.Name == "张三") .ToList();
例三:(为何说:"不是全部的点标记均可以转成查询表达式"【此例只适用于IEnumerator】)
此条点标记你能转成查询表达式吗?
var list = new List<string>() { "张三", "张三", "张三", "张三", "李四", "张三", "李四", "张三", "李四" }; var students2 = list .Where((item, index) => item == "张三" && index % 2 == 0) .Select((item, index) => new { item, index }) .ToList();
查询表达式你能Reverse吗?
var list = new List<string>() { "张三1", "张三2", "张三3", "张三0", "李四9", "张三3", "李四", "张三2", "李四" }; var students2 = list .Where((item, index) => item.Contains("张三")) .Select((item, index) => new { item, index }) .Reverse()//反序 .ToList();
经过上面的对比,好像查询表达式一文不值了。no,不是这样的。
好比下面几种状况咱们就能够选择使用查询表达式:
例一:(本例适用于Linq to Object 和 没有建主外键的EF查询)
点标记中的Join须要传四个参数表达式,是否是有点晕了。。。
var list1 = new Dictionary<string, string> { { "1", "张三" }, { "2", "李四" }, { "3", "张三" }, { "4", "张三" } }; var list2 = new Dictionary<string, string> { { "1", "张三" }, { "2", "李四" }, { "3", "李四" }, { "4", "张三" } }; //查询表达式 var obj1 = from l1 in list1 join l2 in list2 on l1.Key equals l2.Key select new { l1, l2 }; //点标记 var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 });
例二:
点标记须要区分OrderBy、ThenBy有没有以为麻烦
//查询表达式 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 }; //点标记 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 });
总以为查询表达式更多的只是为了照顾那些写惯了sql的程序员。
关于联接查询使用查询表达式会更合适一些这个上面已经说了。
接下来咱们写内联、左联、交叉联的查询表达式和对应的点标记代码。(目的:可能有些人不会,同时在这里也给本身作个备忘)
内联:
左联:
交叉联: