【转】Linq表达式、Lambda表达式你再度爱好哪个?

【转】Linq表达式、Lambda表达式你再度爱好哪个?

【转】Linq表达式、Lambda表达式你再爱好哪个?

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

如图:

个人档案 1

有鉴于此Linq表达式和Lambda表达式并无呀可比性

那么和Lambda表达式相关的整条语句称作什么呢?在微软连没被起官方的命名,在《深入理解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 });

为何选择点标记 

本人相信又多的食指偏偏于选择点标记。具体什么原因我吗说不清(可能是点标记中的Lambda更加文雅吧)。对于自个人来说,也是更喜欢点标记这种方法。

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#基础知识巩固系列》

admin

网站地图xml地图