【转】Linq表明式、兰姆(Lamb)da表达式你更爱好哪个?

【转】Linq表达式、拉姆da表明式你更爱好哪个?

什么是Linq表达式?什么是Lambda表达式?

如图:

图片 1

总而言之Linq表明式和兰姆da表达式并从未怎么可比性

这与拉姆(Lamb)da表明式相关的整条语句称作什么吗?在微软并没有交给官方的命名,在《深远领悟C#》中称为点标记

图片 2

查询表明式、点标记你更欣赏哪个?

因此,我们的题目标问讯根本就不恰当。应该是“询问表明式和点标记你更爱好哪个?”。如:

 //查询表达式
 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 });

干什么选拔点标记 

我深信不疑更多的人偏向选用点标记。具体哪些原因我也说不清(可能是点标记中的兰姆(Lamb)da更加文(Gavin)雅吧)。对于自身个人来说,也是进一步喜欢点标记这种办法。

1、所有的询问表明式都可以转成对应的点标记。反之,不是持有的点标记都得以转成查询表明式。

怎么?因为查询表明式在编译后就一贯变成了点标记:(以下是下边多少个语句对应的编译后的反编译C#代码)

图片 3

转移了一模一样的代码。(由于是编译后的,好多乱七八糟的代码。大家只看Where和Select关键字就掌握,使用的都是点标记。)

2、点标记确实比查询表明式更加文雅

例一:

 //查询表达式
 var students1 = from t in db.Students
                 where t.Name == "张三"
                 select t;
 //点标记
 var students2 = db.Students
                 .Where(t => t.Name == "张三");

自身干什么一定要 select
哟,这句没卵用的废话就不可以省吧?是的,省了就报错:

图片 4

例二:

务必需要括号包裹起来才能取结果集?你仍能更丑一点呢?

//查询表达式
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();

ListA.Distinct().ToList();//去重
ListA.Except(ListB).ToList();//差集
ListA.Union(ListB).ToList();  //并集
ListA.Intersect(ListB).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的程序员。

连通查询(内联、左联、交叉联)

至于联接查询利用查询表达式会更贴切一些这多少个下边已经说了。

接下去我们写内联、左联、交叉联的查询表达式和相应的点标记代码。(目标:可能有些人不会,同时在这边也给协调做个备忘)

内联:

图片 5

左联:

图片 6

交叉联:

图片 7

骨子里关于联接查询,假如EF建好了主外键我要么觉得点标记用起来更爽爽的。

 

结束:

本文并不是要改成你的习惯,也不是否定你的理念。仅仅只是表明个人对点标记和查询表明式的有点通晓。

有关是选拔查询表明式仍旧点标记,可能起着更大决定性的效能的是集团一同的习惯和专业。

接下来还想说说,只要大家相比较咋样,很可能就会有人跳出了,什么绝不比,用好了都同样,什么什么才是最首要的,什么什么样的。。。

就像许几个人会反感java和C#的自查自纠,其实自己个人觉得相比下底层实现、相比较下语法简易也不是不能够的,只要大家得以从中学到知识(个人也是不欣赏相比较何人什么人谁学怎么着工资多少有点)。

今日的友好相比较明日的友好,今天的友爱相比较之下前些天的友爱。只要能够发展为啥不用相比呢?

 

本文以一头至《C#基础知识巩固体系