• Linq表达式、Lambda表达式你更喜欢哪个?


    什么是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<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的程序员。

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

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

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

    内联:

    左联:

    交叉联:

  • 相关阅读:
    【连载3】二手电商的交易模式与业务价值
    【连载0】二手电商专题研究前言
    【连载2】二手电商平台的四要素
    【连载1】何为二手实物电商
    阿里的社区梦 能靠闲鱼完成吗?
    二手回收能否翻过BAT这座大山?
    把握这两点,抢占下一个电商风口|2016最新中国电商App排名&研究报告
    互联网巨头为何偏爱“二手货”?告诉你真实的理由
    2016中国app年度排行榜:十大行业、25个领域、Top 500 和2017趋势预测
    Eventbus 使用方法和原理分析
  • 原文地址:https://www.cnblogs.com/Hackson/p/7059744.html
Copyright © 2020-2023  润新知