美文网首页
C#基础LinQ使用方法

C#基础LinQ使用方法

作者: 会打马赛克的小老弟 | 来源:发表于2019-12-15 20:46 被阅读0次

    首先我们看看LinQ应用架构。

    LinQ定义的大约40个查询的操作符,如常见的Select、from、in、where以及Orderby等。LINQ 提供了一条更常规的途径即给.Net Framework添加一些可以应用于所有信息源( all sources of information )的具有多种用途( general-purpose )的语法查询特性( query facilities ),这是比向开发语言和运行时( runtime )添加一些关系数据( relational )特性或者类似 XML 特性( XML-specific )更好的方式。这些语法特性就叫做 .NET Language Integrated Query (LINQ) 。

    语法实例:

    1、假设我们需要从一个集合中查询数据用一般 简单粗暴的方法可以这么写

    var rets = new List<MartialArtsMaster>();
                foreach (var temp in master) {
                    if (temp.Level > 8) {
                        rets.Add(temp);
                    }
                }
        foreach (var ret in rets) Console.WriteLine(ret);
    

    2、如果我们使用常见的LinQ的表达式写法可以简化代码繁杂项,增加了代码的可阅读性如:
    var rets = from m in master where m.Level > 8 && m.Menpai == "这里是限制条件" select m;

    3、扩展方法的写法,在方法中加入限制条件,通过返回值来限定LinQ,如:

    var rets = master.Where(test);
        //过滤方法
            static bool test(MartialArtsMaster master) {
                if (master.Level > 8) return true;
                return false;
            }
    

    扩展方法可以用Lambda简化,如:

    var rets = master.Where(m => m.Level > 8 ).OrderBy(x => x.Level).ThenBy(x=>x.Age);
    

    二、LinQ联合查询。

    联合查询通俗理解就是联合在一起查询,但是查询什么?怎么查询?联合的必要条件是什么?

    既然是联合,那肯定是需要两个集合,或者数据源了,在这里我就统一用Lambda的表达式和扩展方法来写(因为简单粗暴)

    假设我们有两个集合,一个是角色信息的集合,其中包括ID、Name、所学功夫等,另一个集合就是功夫信息集合,其中包含ID,Name、Power。下面我们写第一个表达式的LinQ联合查询:

    var rets = from m in master from k in kongfu where m.Kongfu == k.Name && k.Power > 90 select m;//select new {master = m,kongfu = k};
    

    这里查找了两个集合一个是master一个是kongfu的集合,限制条件是 master(大侠)的功夫等于kongfu中名字(可以看需要指定),且杀伤力大于90的大侠,select m 然后返回目标数据,如何需要返回两个目标数据,则我们需要加上new关键字和 { “这里指定返回目标数据” }。下面我们看看扩展方法的写法:

    var rets = master.SelectMany(m => kongfu, (m, k) => new {master = m, kongfu = k}).Where(x=>x.master.Kongfu == x.kongfu.Name && x.kongfu.Power > 90);

    SelectMany:投影操作符(C#中的方法,具体资料请Google)

    我先把一些关键字放上来,免得不理解
    Join on 的联合用法:
    var rets = from m in master join k in kongfu on m.Kongfu equals k.Name where k.Power > 90 select new {master = m ,kongfu = k};
    把konogfu的集合加入到master中查询。
    into groups 分组查询:

    var rets = from k in kongfu join m in master on k.Name equals m.Kongfu into groups orderby groups.Count() select new {kongfu = k,count=groups.Count()};

    把相同的属性放入一个组中,然后在这个组中查找数据
    自身字段,一个集合的时候分组查询
    var rets = from m in master group m by m.Kongfu into g orderby g.Count() select new {count = g.Count(), g.Key};

    单个集合的时候使用,把拥有相同属性(功夫)的大侠放入一个组中查找
    量词操作 any all:

    bool rets = master.Any(x => x.Menpai == "丐帮");
    Console.WriteLine(rets);
    bool rets = master.All(m => m.Menpai == "丐帮");
    Console.WriteLine(rets);
    

    any 判断集合中是否含有、包含指定条件(有一个)
    all判断集合中是否含有、包含指定条件(所有)

    相关文章

      网友评论

          本文标题:C#基础LinQ使用方法

          本文链接:https://www.haomeiwen.com/subject/exxjnctx.html