毕加索的马

浅话LINQ

Language Integrated Query(LINQ) 是C#3.0 和.NET3.5中最重要的功能,LINQ集成了C#编程语言中的查询语法,可以用相同的语法访问不同的数据源。

一、LINQ的语法规则

LINQ查询表达式必须以from子句开头,以select或group字句结束。在这两个字句之间,可以使用where,orderby,join,let和其他的from字句

二、LINQ的特性

1)推迟查询的执行
Eg:
class Program
    {
        static void Main(string[] args)
        {
            List<string> names = new List<string> { "Ni", "dsad", "Jsdsds", "fsd" };
            var nameWithJ = from n in names where n.StartsWith("J") orderby n select n;
            Console.WriteLine("First iteration");
            foreach (string name in nameWithJ)
            {
                Console.WriteLine(name);
            }
            Console.WriteLine();

            names.Add("Jddd");
            names.Add("Jdsadsa");
            names.Add("Jlldd");

            Console.WriteLine("Second iteration");
            foreach (string name in nameWithJ)
            {
                Console.WriteLine(name);
            }
        }
}

结果:
First iteration
Jsdsds

Second iteration
Jddd
Jdsadsa
Jlldd
Jsdsds

2)过滤
Eg:
List<Racer> racer = new List<Racer>();
var racers = from r in racer  where r.Wins > 13 && r.Country == "China" orderby r.Wins ascending select r;
foreach (var r in racers)
{
       Console.WriteLine(r);
  }
//racer里面的Wins 、Country字段我都没有加,上面的LINQ语句也可以用入表达式写为:var racers=racer.Where(r=>r.Wins>12&&r.Country==”China”).Select(r=>r)

3)用索引来过滤
并不是所有查询都可以用LINQ语句实现的,譬如Where()方法的重载,在Where()方法中可以传入第二个参数------索引
var racers = racer .Where((r, index) => r.FirstName.StartsWith("d") && index % 2 != 0).Select(r => r);
//FirstName的开头字母为d,并且索引值%2!=0的racer
foreach (var r in racers)
{
      Console.WriteLine(r);
}


4)类型过滤
object[] data = { "one", 2, 3, "four", "five", 6 };
var query = data.OfType<string>();
foreach (var s in query)
{
    Console.WriteLine(s);
}
结果:
one
four
five

5)复合的from子句/排序
eg:
#region 复合的from子句
            //var f = from r in racer where r.Cars == "aaa" orderby r.LastName select r.FirstName + " " + r.LastName;
            //var f = from r in racer  
            //        from c in r.Cars
            //        where c == "aaa"
            //        orderby r.LastName
            //        select r.FirstName + " " + r.LastName;
#endregion


//#region 排序
            //var f = from r in racer where r.Coutry == "China" orderby r.Wins descending select r;
            //var f = racer .Where(r => r.Coutry == "China").OrderByDescending(r => r.Wins).Select(r => r);
//#endregion


var f = (from r in racer where r.Coutry == "China" orderby r.Wins descending select r).Take(3);//提取前三个结果
foreach (var r in f)
{
          Console.WriteLine(r);
}

6)分组
             //         var list = from r in racer
            //           group r by r.Country into g
            //           orderby g.Count() descending,g.Key //根据Count排序,当Count相同的时候根据Key排序
            //           where g.Count() >= 2
            //           select g.Key+"   "+g.Count();
            
           用入表示式:
             //        var list = racer .
            //         GroupBy(r => r.Country).
            //         OrderByDescending(g => g.Count()).
            //         ThenBy(g => g.Key).
            //         Where(g => g.Count() >= 2).
            //         Select(g => g.Key + "    " + g.Count());
            //foreach (var r in list)
            //{
            //    Console.WriteLine(r);
            //}

//对嵌套的对象分组
                      var list = from r in racer
                       group r by r.Country into g
                       orderby g.Count() descending, g.Key
                       where g.Count() >= 2
                       select new
                       {
                           Country = g.Key,
                           Count = g.Count(),
                           Racers = from r1 in g orderby r1.Name select r1.Name
                       };
            foreach (var item in list)
            {
                Console.WriteLine(item.Country+"\t"+item.Count);
                foreach (var name in item.Racers)
                {
                    Console.Write(name+"\t");
                }
                Console.WriteLine();
            }
7)连接
var racers = from r in racer  where   r.Years > 2003
                      select new
                      {
                             Year = r.Years,
                              Country = r.Country
                       };
var teams = from t in racer where   t.Years > 2003
                     select new
                      {
                            Year = t.Years,
                            Name = t.Name
                      };
var racersAndTeams = from r in racers  join
t in teams on r.Year equals t.Year
                                 select new
                                 {
                                     Year = r.Year,
                                     Country = r.Country,
                                     Name = t.Name
                                 };
foreach (var item in racersAndTeams)
{
         Console.WriteLine(item.Year + "\t" + item.Country + "\t" + item.Name);
}

8)分区
Eg:
int pageSize=5; //每一页显示的数目
int numberPages=(int)Math.Ceiling(racer.count())/(double)pageSize; //页数
for(int page=0;page<numberPage;page++)
{
     Console.WriteLine("page {0}",page);
     var racers=(from r in racer  orderby r.LastName  select r.FirstName+""+r.LastName)
     .Skip(page*pageSize).Take(pageSize); //Skip表示跳过当前页之前的数据,Take表示取出当前页的数据
     foreach(var name in racers)
    {
           Console.WriteLine(name);
    }
}

9)合计操作符
合计操作符Count()  Sum() Min() Max() Average()不是返回一个序列,而是返回一个值
Eg:
var query=from r in racer  where r.Year.Count()>3
         select new
         {
             TimeChampions=r.Year.Count();
          };
Foreach(var r in query)
{
    Console.WriteLine(r.TimeChampions);
}
Sun方法汇总序列中的所有数字,并返回这些数字的和
…….

10)转换
调用Tolist()方法,立即执行查询,把结果放在List<T>里面
List<Racer> racers=(from r in racer  where r.Wins>12 select r).ToList();
foreach(var racer in racers)
{
  Console.WriteLine(racer);
}

posted on 2011-06-19 08:59  毕加索的马  阅读(280)  评论(0编辑  收藏  举报

导航