zoukankan      html  css  js  c++  java
  • Linq表达式和Lambda表达式用法对比

    什么是Linq表达式?什么是Lambda表达式?
    前一段时间用到这个只是,在网上也没找到比较简单明了的方法,今天就整理了一下相关知识,有空了再仔细研究研究

    public Program()
    {
    List<Student> allStudent = new List<Student> {
    new Student("张三",23),
    new Student("李四",29),
    new Student("王二",25),
    new Student("赵六",26)
    };
    //Ling表达式
    var stus1 = from s in allStudent
    where s.Name == "王二"
    select new { s.Name, s.Age };
    //Lanmbda表达式
    var stus2 = allStudent.Where(t => t.Name == "王二").Select(t => new { t.Name, t.Age });
    }
    
    public class Student
    {
    public string Name { set; get; }
    public int Age { set; get; }
    public Student(string name, int age)
    {
    this.Name = name;
    this.Age = age;
    }
    }
    Lambda确实比Linq表达式更加优雅
    Linq表达式的select不能省略
    //Linq
    var students1 = from t in db.Students
    where t.Name == "张三"
    select t;
    //Lambda
    var students2 = db.Students
    .Where(t => t.Name == "张三");
    
    Linq表达式必须需要括号包裹起来才能取结果集
    //Linq
    var students1 = (from t in db.Students
    where t.Name == "张三"
    select t).ToList();
    //Lambda
    var students2 = db.Students
    .Where(t => t.Name == "张三")
    .ToList();

    什么时候使用Linq?
    通过上面的对比,好像Linq一文不值了。no,不是这样的。
    比如下面几种情况我们就可以选择使用Linq:
    例一:(本例适用于Linq to Object 和 没有建主外键的EF查询)
    Lambda中的Join需要传四个参数表达式,是不是有点晕了。。。

    var list1 = new Dictionary<string, string> { { "1", "张三" }, { "2", "李四" }, { "3", "张三" }, { "4", "张三" } };
    var list2 = new Dictionary<string, string> { { "1", "张三" }, { "2", "李四" }, { "3", "李四" }, { "4", "张三" } };
    
    //Linq
    var obj1 = from l1 in list1
    join l2 in list2
    on l1.Key equals l2.Key
    select new { l1, l2 };
    //Lambda
    var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 });

    例二:
    Lambda需要区分OrderBy、ThenBy有没有觉得麻烦

    //Linq
    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 };
    //Lambda
    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 });


    总觉得Linq更多的只是为了照顾那些写惯了sql的程序员。

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

    关于联接查询使用Linq会更合适一些这个上面已经说了。
    接下来我们写内联、左联、交叉联的Linq和对应的Lambda代码。(目的:可能有些人不会,同时在这里也给自己做个备忘)
    内联:

    var list1 = new Dictionary<string, string> { { "1", "张三" }, { "2", "李四" }, { "3", "张三" }, { "4", "张三" } };
    var list2 = new Dictionary<string, string> { { "1", "张三" }, { "2", "李四" }, { "3", "李四" }, { "4", "张三" } };
    //Linq查询
    var ojb2 = (from l1 in list1
    join l2 in list2
    on l1.Key equals l2.Key
    select new { l1, l2 }).ToList();
    //Lambda查询
    var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 }).ToList();

    左联:

    var list1 = new Dictionary<string, string> { { "1", "张三" }, { "2", "李四" }, { "3", "张三" }, { "4", "张三" } };
    var list2 = new Dictionary<string, string> { { "1", "张三" }, { "2", "李四" }, { "3", "李四" }, { "4", "张三" } };
    //Linq查询
    var ojb2 = (from l1 in list1
    join l2 in list2
    on l1.Key equals l2.Key into list
    from l2 in list.DefaultIfEmpty()
    select new { l1, l2 }).ToList();
    //Lambda查询
    var obj = list1.GroupJoin(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2=l2.FirstOrDefault() }).ToList();

    交叉联:

    var list1 = new Dictionary<string, string> { { "1", "张三" }, { "2", "李四" }, { "3", "张三" }, { "4", "张三" } };
    var list2 = new Dictionary<string, string> { { "1", "张三" }, { "2", "李四" }, { "3", "李四" }, { "4", "张三" } };
    //Linq查询
    var ojb2 = (from l1 in list1
    from l2 in list2
    select new { l1, l2 }).ToList();
    //Lambda查询
    var obj = list1.SelectMany(l1 => list2.Select(l2 => new { l1,l2})).ToList();

    FROM :http://www.cnblogs.com/zhaopei/p/5746414.html

  • 相关阅读:
    linux下硬盘分区、格式化以及文件管理系统
    linux下的文档处理及tar命令
    linux文件及目录的权限管理
    linux用户和群组
    linux下mysql的安装与使用
    linux上uwsgi+nginx+django发布项目
    linux虚拟环境搭建
    linux目录文件操作
    linux基本命令
    rbac组件之权限初始化(五)
  • 原文地址:https://www.cnblogs.com/chunhui212/p/5899158.html
Copyright © 2011-2022 走看看