`
terryfeng
  • 浏览: 504463 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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


        }
分享到:
评论

相关推荐

    LINQ 的标准查询操作符

    LINQ的核心是它的标准查询操作符库,这些操作符提供了丰富的功能,可以对序列执行各种操作,如过滤、投影、聚合、连接和排序。 **1. LINQ提供程序** - **LINQ to Objects**:用于查询内存中的对象集合,如数组和...

    LINQ标准查询操作符.pdf

    ### LINQ标准查询操作符详解 #### 一、投影操作符 **1. Select** - **定义**: `Select`操作符用于对集合中的每个元素应用指定的函数,并将结果返回为一个新的序列。此操作通常用来从原始数据集中提取特定属性或...

    linq标准查询操作符

    ### LINQ标准查询操作符详解 #### 一、投影操作符 **1. Select** `Select` 操作符用于从源序列中选择一系列值,并将其转换为新的序列。这种转换通常涉及从源序列中的每个元素生成一个新元素。在 LINQ 查询中,`...

    LINQ标准查询操作符(pdf中文版)---通俗易懂

    ### LINQ标准查询操作符详解 #### 一、投影操作符 **1. Select** `Select` 是一种常用的投影操作符,它允许我们基于输入序列中的每个元素创建一个新序列。这种操作通常用来改变序列中元素的数据类型或者提取特定...

    Linq操作符27个常用说明.docx

    ### Linq操作符27个常用说明 #### 1. Where 操作符 - **功能描述**:`Where` 操作符用于筛选出输入集合中符合特定条件的元素,并将其组织成一个新的序列。 - **应用场景**:当你需要从现有集合中筛选出一部分满足...

    LINQ Samples.zip

    例如,`Select`操作符用于投影每个源元素到新形式,而`Cast`和`OfType`则用于将对象转换为特定的类型。`SelectMany`则用于将一个集合的元素扩展为多个集合,并将它们组合成一个单一的查询结果。 2. **其他操作符**...

    LINQ简要技术~~~

    - **转换操作符**:如`Cast()`和`OfType()`用于将元素转换为特定类型。 - **元素操作符**:如`First()`、`Last()`和`Single()`用于获取序列的第一个、最后一个或唯一的元素。 - **生成操作符**:如`Range()`和`...

    101个linq例子程序

    8. **LINQ - Conversion Operators**:包括`Cast`和`OfType`等转换操作符,用于将一个类型转换为另一个类型,以便进行查询。 9. **LINQ - Set Operators**:可能涵盖了`Distinct`、`Except`、`Intersect`、`Union`...

    linq 入门 培训 教程

    - **筛选数据**: `Where`用于根据条件过滤元素,`OfType`用于仅保留指定类型的元素。 - **投影运算**: `Select`用于改变每个元素的形式,`SelectMany`用于组合多个集合。 - **排序**: `OrderBy`和`ThenBy`用于对数据...

    Reactive Framework介绍

    4. **创建自定义操作符**:如果标准操作符无法满足需求,可以创建自定义操作符。 5. **利用 Rx 库中的现有操作符**:在大多数情况下,Rx 提供的操作符已经足够使用。 #### 四、总结 Reactive Framework 是一个强大...

    introduction to Rx

    为了转换和减少序列,Rx提供了各种操作符,例如Where用于过滤,Skip和Take用于选择序列的一部分,以及First和Last等聚合函数。Aggregation操作符允许计算序列的统计信息,如Count、Min、Max、Sum和Average。 Rx还...

    C#常用函数和方法集汇总

    - `Array.IndexOf(T[] array, T value)`:查找元素在数组中的索引位置。 3. **集合操作**: - `List&lt;T&gt;`:动态大小的列表,支持添加、删除、查找等操作。 - `HashSet&lt;T&gt;`:无序且不重复的元素集合。 - `...

Global site tag (gtag.js) - Google Analytics