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


        }
posted on 2009-10-06 12:23  冯瑞涛  阅读(2425)  评论(4编辑  收藏  举报