博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linq表达式、Lambda表达式你更喜欢哪个?
阅读量:5088 次
发布时间:2019-06-13

本文共 3014 字,大约阅读时间需要 10 分钟。

 

阅读目录

 
 

 

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

 

如图:

 

 

由此可见Linq表达式和Lamdba表达式并没有什么可比性。

 

那与Lamdba表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在《深入理解C#》中称为点标记

 

 

查询表达式、点标记你更喜欢哪个?

 

所以,我们的标题的提问根本就不合适。应该是“Linq查询表达式和点标记你更喜欢哪个?”。如:

 

//查询表达式 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更加优雅吧)。对于我个人来说,也是更加喜欢点标记这种方式。

 

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

 

为什么?因为查询表达式在编译后就直接变成了点标记:(以下是上面两个语句对应的编译后的反编译C#代码)

 

 

生成了一模一样的代码。(由于是编译后的,好多乱七八糟的代码。我们只看Where和Select关键字就知道,使用的都是点标记。)

 

2、点标记确实比查询表达式更加优雅

 

例一:

 

//查询表达式 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
() { "张三", "张三", "张三", "张三", "李四", "张三", "李四", "张三", "李四" };var students2 = list .Where((item, index) => item == "张三" && index % 2 == 0) .Select((item, index) => new { item, index }) .ToList();

 

查询表达式你能Reverse吗?

 

var list = new List
() { "张三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
{ { "1", "张三" }, { "2", "李四" }, { "3", "张三" }, { "4", "张三" } };var list2 = new Dictionary
{ { "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的程序员。

 

联接查询(内联、左联、交叉联)

 

关于联接查询使用查询表达式会更合适一些这个上面已经说了。

 

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

 

内联:

 

 

左联:

 

 

交叉联:

 

 

转载于:https://www.cnblogs.com/Hackson/p/7059744.html

你可能感兴趣的文章
【BZOJ 5222】[Lydsy2017省队十连测]怪题
查看>>
第二次作业
查看>>
【input】 失去焦点时 显示默认值 focus blur ★★★★★
查看>>
Java跟Javac,package与import
查看>>
day-12 python实现简单线性回归和多元线性回归算法
查看>>
Json格式的字符串转换为正常显示的日期格式
查看>>
[转]使用 Razor 进行递归操作
查看>>
[转]Android xxx is not translated in yyy, zzz 的解决方法
查看>>
docker入门
查看>>
Android系统--输入系统(十一)Reader线程_简单处理
查看>>
监督学习模型分类 生成模型vs判别模型 概率模型vs非概率模型 参数模型vs非参数模型...
查看>>
Mobiscroll脚本破解,去除Trial和注册时间限制【转】
查看>>
实验五 Java网络编程及安全
查看>>
32位与64位 兼容编程
查看>>
iframe父子页面通信
查看>>
ambari 大数据安装利器
查看>>
java 上传图片压缩图片
查看>>
magento 自定义订单前缀或订单起始编号
查看>>
ACM_拼接数字
查看>>
计算机基础作业1
查看>>