C#集合查询Linq在项目中使用详解

 更新时间:2022年05月29日 15:03:19   作者:握风  
本文主要介绍了C#集合查询Linq在项目中使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

要说哪门后端语言的语法优雅,那就不得不提C#,而在我看来,LINQ语法可以说是其优雅的重要一环!

通常后端从数据库查询出来的数据并不是直接返回给前端使用的(不然前端....),而是需要进行二次的加工筛选处理等操作!而这个操作就离不开LINQ,不然for循环套for循环,先不说可不可行,肯定可行,但是代码的可读性完全丢失,其他同行看到也会笑话人,连编译器运行这段代码时也是发尽牢骚(....),从而导致程序的性能低下!
当然如果用SQL一次性把数据处理到位也行,但是实际项目开发中,很少能一次处理到位的,往往都需要二次处理(比如:我不仅需要List,还需要统计信息,总数、均值,总和等)

Linq Lambda

说到Linq,就不得不提Lambda表达式了,说实话,实际开发中,直接用Linq写的相关代码还真不多,Lambda表达式到处都是!

先上代码,直观看看他们两者有什么区别

static void Main(string[] args)
{
    List<User> users = new List<User>();
    var letters = "abcdefghijklmnopqrstuvwxyz";
    var rand = new Random();
    for (int i = 0; i < 10; i++)
    {
        string name = default;
        for(int j = 0; j < 4; j++)
        {
            name += letters[rand.Next(25)];
        }
        users.Add(new User { Name = name, Age = rand.Next(1, 99) });
    }

    //Linq
    IEnumerable<User> usera = from u in users where u.Age < 35 select u;
    //usera.ToList();

    //Lambda
    List<User> userb = users.Where(x => x.Age < 35).ToList();

    //输出来看看
    foreach(User u in usera)
    {
        Console.WriteLine("name:{0},age:{1} \n", u.Name, u.Age);
    }
    Console.WriteLine("------------------");
    foreach (User u in userb)
    {
        Console.WriteLine("name:{0},age:{1} \n", u.Name, u.Age);
    }

    Console.ReadLine();
}

class User
{
    public string Name { get; set; }

    public int Age { get; set; }
}

看完代码,是不是感觉Linq跟SQL差不多,对,本来他们就是类似语言,我个人猜测应该是模仿出来的一种语法糖吧(具体谁模仿谁就不得而知了),相似也好,学起来更方便了。而Lambda表达式写起来是真的舒服!
那么,Linq和Lambda有什么关系呢
包含的关系,Linq范围更广一些,Lambda表达式看起来像一个箭头函数,就是!,也可以说是一个匿名函数!他相当于Linq的二次封装语法糖吧(个人理解)
基本上Linq能实现的,Lambda表达式都可以实现
通常沟通中,说Linq写法,其实默认就是Linq Lambda表达式了。直接链式写法,简洁,可读性,后期维护起来也是非常方便的。

众所周知,SQL能实现的功能是非常强大的,而Linq同样可以实现。
但实际开发中,SQL一般会写的相当复杂,聚合查询是常事,而Linq一般很少涉及(也能多表查询),更多的是诸如去重、筛选、排序、分组、统计计算等操作

Linq项目中的一次使用经历

获取不同用户的权限菜单 当用户登录时,可以获取到用户的权限菜单集合(id集合),而具体展示菜单,还需要到全部菜单集合中去查找对应的,然后筛选出来,返回给前端,最后进行渲染展示!
如果菜单集合List全都是一级菜单,那相当简单,但是如果有二级、三级菜单就比较麻烦了,在这个筛选过程中,我就用到了Linq来实现部分功能

//powers 用户权限菜单集合
//menus 全部菜单集合
//menus.SubItems 二级菜单集合

(from sub in menus.SubItems where powers.Any(x=>x.Key == sub.Id) select sub).Count()

如上代码段,可以获取到当前菜单的子菜单的个数
如果不加外层的Count(),那结果就是当前菜单子菜单(此用户有权限的)集合
如果不采用Linq,一行代码很难实现(方法还是有的,只是不会Linq那么方便写)

Linq to js [在前端的应用]

LINQ其实并不是后端语言的专属,前端同样可以使用,只需要引用相应的js插件即可
js、vue等项目中都有对应的插件(例如jslinq),仅需要对应的组件中引入插件(也可以在母版页或全局引用),然后就可以像后端语言中一样的使用即可。
具体写法与后端语言差不多,常用方法名也都一样
要说不一样的地方,我感觉唯一不好的体验就是,前端使用时,没有代码提示了,如果对LINQ不太熟悉的,在使用LINQ时,还需要借助相关文档,多用几次,自然就不算什么问题了。

这里就不展开细说Linq在前端的具体用法了,需要的可以自行查询,这里仅做一个抛砖引玉的效果。

到此这篇关于C#集合查询Linq在项目中使用详解的文章就介绍到这了,更多相关C#集合查询Linq内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#中SetStyle的具体使用

    C#中SetStyle的具体使用

    本文主要介绍了C#中SetStyle的具体使用,该方法用于启用或禁用特定的控件样式,以控制控件的行为和外观,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • C# WinForm窗体编程中处理数字的正确操作方法

    C# WinForm窗体编程中处理数字的正确操作方法

    这篇文章主要介绍了C# WinForm窗体编程中处理数字的正确操作方法,本文给出了正确示例,并解释了为什么要这么做,需要的朋友可以参考下
    2014-08-08
  • 深入分析c# 封装和访问修饰符

    深入分析c# 封装和访问修饰符

    这篇文章主要介绍了c# 封装和访问修饰符的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C#中遍历Hashtable的4种方法

    C#中遍历Hashtable的4种方法

    这篇文章主要介绍了C#中遍历Hashtable的4种方法,本文直接给出实例代码,需要的朋友可以参考下
    2015-06-06
  • Chrome Visual Studio 2005下的编译过程

    Chrome Visual Studio 2005下的编译过程

    研究Chrome ,首先得把它编译出来,这对于后续的代码分析和阅读有很大的帮助,想想自己编译出一个 Chrome 浏览器来使用,那是一件很炫的事情。
    2009-07-07
  • WinForm限制窗体不能移到屏幕外的方法

    WinForm限制窗体不能移到屏幕外的方法

    这篇文章主要介绍了WinForm限制窗体不能移到屏幕外的方法,实例分析了C#中WinForm窗体操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C# 格式化字符串的实现代码

    C# 格式化字符串的实现代码

    这篇文章主要介绍了C# 格式化字符串的实现代码,需要的朋友可以参考下
    2016-11-11
  • C# double类型变量比较分析

    C# double类型变量比较分析

    这篇文章主要介绍了C# double类型变量比较分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C#中static的详细用法实例

    C#中static的详细用法实例

    在C#中所有方法都必须在一个类的内部声明,然而如果把一个方法或字段声明为Static,就可以使用类名来调用方法或访问字段,下面这篇文章主要给大家介绍了关于C#中static详细用法的相关资料,需要的朋友可以参考下
    2022-12-12
  • C# 特殊的string类型详解

    C# 特殊的string类型详解

    本文主要介绍了C# 特殊的string类型。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02

最新评论