• LINQ 标准的查询操作符 过滤 where、index1、OfType


    LINQ 查询为最常用的操作符定义了一个声明语法。还有许多标准查询操作符

    下面是 LINQ  定义的标准查询操作符。

    image

    image

    image

    下面开始学习这些查询

    添加Using

    using System.Linq;
    using System.Linq.Expressions;

    过滤

    使用 Where  子句,可以合并多个表达式。例如,找出赢得至少 15  场比赛的巴西和奥地利赛手。传送给
    where  子句的表达式的结果类型应是 bool:

    /// <summary>
            /// 过滤
            /// </summary>
            private static void SimpleFiltering()
            {
                var racers = from r in Formula1.GetChampions()
                             where r.Wins > 15 && (r.Country == "Brazil" || r.Country == "Austria")
                             select r;
    
                foreach (var r in racers)
                {
                    Console.WriteLine("{0:A}", r);
    
                }
            }

    并不是所有的查询都可以用 LINQ  查询完成。也不是所有的扩展方法都映射到 LINQ  查询子句上。高级
    查询需要使用扩展方法。为了更好地理解带扩展方法的复杂查询,最好看看简单的查询是如何映射的。使用扩
    展方法 Where()和 Select(),会生成与前面 LINQ  查询一样的结果:

    /// <summary>
           /// 过滤,带扩展方法的复杂查询
           /// </summary>
           private static void SimpleFiltering()
           {
               //var racers = from r in Formula1.GetChampions()
               //             where r.Wins > 15 && (r.Country == "Brazil" || r.Country == "Austria")
               //             select r;
    
               var racers2 = Formula1.GetChampions().
                   Where(r => r.Wins > 15 && (r.Country == "Brazil" || r.Country == "Austria")). //先计算右侧括号里面的谓词结果,做参数再计算
                   Select(r => r); //谓词条件是r,也就是没有条件只传一个参数
    
               foreach (var r in racers2)
               {
                   Console.WriteLine("{0:A}", r);
    
               }
           }

    用索引来过滤

    不能使用 LINQ 查询的一个例子是 Where()方法的重载。在 Where()方法的重载中,可以传送第二个参数—个索引。

    索引是过滤器返回的每个结果的计数器(这里用index1这个变量来存放)。可以在表达式中使用这个索引(之后可以使用这个变量

    ,执行基于索引的计算。下面的代码由 Where()扩展方法调用,它使用索引返回姓氏以 A  开头、索引为偶数的赛手:

    private static void SimpleFilteringWithIndex()
            {
                var racers = Formula1.GetChampions().Where((r, index1) => r.LastName.StartsWith("A") && index1 % 2 != 0);
                //index1 从0开始计数, 在重载的方法第二个参数为其赋值
                foreach (var r in racers)
                {
                    Console.WriteLine("{0:A}", r);
                }
    
            }

    类型过滤

    为了进行基于类型的过滤, 可以使用OfType()扩展方法。 这里数组数据包含string  和int对象。 使用OfType()
    扩展方法,把 string  类传送给泛型参数,就从集合中返回字符串:

    private static void TypeFiltering()
            {
                object[] data = { "one", 2, 3, "four", "five", 6 };
                var query = data.OfType<string>();
    
                foreach (var s in query)
                {
                    Console.WriteLine(s);
                }
            }

    模糊过滤

    相当于SQL语句中的Like where r.Name.Contains(queryPara)

    protected void btnSelect_Click(object sender, EventArgs e)
            {
    
                string queryPara = txtName.Text;
    
                List<MyData> query = cacheManager.GetData(KEYNAME) as List<MyData>;
                if (null == query)
                {
                    //条件调用数据库
                    query = new List<MyData>
                    { 
    
                    new MyData(){ Age=1, Color="New Yellow", Name="New China"},
                    new MyData{ Age=2,Color="New Black",Name="New USA"}
                    };
                    Response.Write("读取数据库<br />");
                    //缓存
                    cacheManager.Add(KEYNAME, query);
    
                }
                else
                {
    
                    List<MyData> filter = (from r in query
                                           where r.Name.Contains(queryPara)
                                           select r).ToList();
    
                    //如果这里从缓存中查出来的数据不为空但是却不正确(数量少,更新,添加)
                    if (filter.Count == 0)
                    {
                        //如果结果等于空一定是查数据库
                        List<MyData> addQuery = new List<MyData>
                                { 
                                new MyData(){ Age=1000, Color="New Green", Name=queryPara},
                                
                                };
                        Response.Write("读取数据库<br />");
                        query.AddRange(addQuery);
                        //缓存
                        cacheManager.Add(KEYNAME, query);
    
                        query = addQuery;
                    }
                    else //筛选到结果则为结果
                    {
                        query = filter;
    
                    }
    
                }
    
                foreach (MyData q in query)
                {
    
                    Response.Write(q.Name + "<br />");
                }
    
    
            }
    冯瑞涛
  • 相关阅读:
    fixture中使用request参数
    python 使用values() 获取字典中所有的值
    php连接mssql数据库的方法以及错误设置
    C#使用tabcontrol控件可操作多窗体嵌入以及双击窗口名称可关闭
    ie下js调试超级爽的工具IE WebDeveloper V2 (附注册码)
    php curl 下载文件
    www.qian14.cn 终于解决了这个问题
    二级缓存伪优化揭秘(转)
    向访客和爬虫显示不同的内容
    我的新博客地址!
  • 原文地址:https://www.cnblogs.com/finehappy/p/1578422.html
Copyright © 2020-2023  润新知