LINQ 101——约束、投影、排序

什么是LINQ:LINQ 是一组 .NET Framework 扩展模块集合,内含语言集成查询、集合以及转换操作。它使用查询的本机语言语法来扩展 C# 和 Visual Basic,并提供利用这些功能的类库。

什么是LINQ 101:是学习LINQ的不错的资源(下载地址:http://pan.baidu.com/s/1ntE74NJ),当初我也是看LINQ101来熟悉LINQ的。现把我当时的学习笔记整理出来

Restriction (约束)
Projection (投影)
Ordering (排序)
Partitioning (分区)
Join
Aggregate(聚合)
Grouping(分组)
Set(集合)
Conversion(转换)
Element(元素操作)

本篇文章介绍前三个

一、 约束 ——where

var query = from item in [集合] where [item满足的条件] select item;

int[] numbers = { 5, 4, 3, 7, 9, -12 };
var query = from n in numbers
            where n % 3 == 0
            select n;
Console.WriteLine("被3整除的数:");
foreach (var num in numbers)
{
    Console.WriteLine(num);
}
View Code

 

多个Where 条件且筛选

 1 var query = from item in sources
 2             where (字段1的条件1) || (字段1的条件2)
 3             where (字段2的条件1) || (字段2的条件2)
 4             select new Entity ....
 5 
 6  7 var query = from item in sources
 8             where (string.IsNullOrEmpty(txtSearch.Text.Trim())) || (item.Filed1.Contains(txtSearch.Text.Trim()))
 9             where (string.IsNullOrEmpty(txtFilter.Text.Trim())) || (item.Filed2.Contains(txtFilter.Text.Trim()))
10             ...
11             select new Entity ....
View Code

 

二、投影——select

例1:让数组中每个数都加1

 1 int[] numbers = { 5, 4, 1, 3, 9, 8,-13 };
 2 
 3 var numsPlusOne =
 4     from n in numbers
 5     select n + 1;
 6 
 7 Console.WriteLine("整数+1:");
 8 foreach (var num in numsPlusOne)
 9 {
10     Console.WriteLine(num);
11 }
View Code

例2:选取某类中一个属性

 1 public class Config
 2 {
 3     public Guid ID { get; set; }
 4     public string Name { get; set; }
 5     public string Remark { get; set; }
 6 
 7     Config() { }
 8 
 9     public static List<Config> GetConfigs()
10     {
11         return new List<Config> 
12         { 
13             new Config{ ID=Guid.NewGuid(), Name="XX1号",Remark="Remark1号"},
14             new Config{ ID=Guid.NewGuid(), Name="XX2号",Remark="Remark2号"},
15             new Config{ ID=Guid.NewGuid(), Name="XX3号",Remark="Remark3号"}
16         };
17     }
18 }
19 
20 
21 static void Linq3()
22 {
23     var source = Config.GetConfigs();
24     var query = from item in source
25                 select item.Name;
26     foreach (var c in query)
27     {
28         Console.WriteLine(c);
29     }
30 }
View Code

例3:数组下标转换

 1 static void Linq4()
 2 {
 3     int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
 4     string[] strings = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
 5 
 6     var textNums =
 7         from n in numbers
 8         select strings[n];
 9 
10     Console.WriteLine("数组下标转换");
11     foreach (var s in textNums)
12     {
13         Console.WriteLine(s);
14     }
15 }
View Code

例3:匿名类型,大小写

 1 static void Linq5()
 2 {
 3     string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };
 4     var query = from word in words
 5                             select new { Upper = word.ToUpper(), Lower = word.ToLower() };
 6     foreach (var item in query)
 7     {
 8         Console.WriteLine("大写: {0} 小写: {1}",item.Upper,item.Lower);
 9     }
10 }
View Code

例4:将投影的属性放到一个类中

 1 public class Dto
 2 {
 3     public string Field1 { get; set; }
 4     public string Field2 { get; set; }
 5     public string Field3 { get; set; }
 6 }
 7 
 8 static void Linq6()
 9 {
10     var source = Config.GetConfigs();
11     var query = from item in source
12                 select new Dto { Field1 = item.ID.ToString(), Field2 = item.Name, Field3 = item.Remark };
13     foreach (var item in query)
14     {
15         Console.WriteLine("{0} {1} {2}", item.Field1, item.Field2, item.Field3);
16     }
17 }
View Code

例5:筛选 加where条件参见 where 例1

例6:复合from子句(选取座机号码区号为021的客户信息)

 1 public class Guest
 2 {
 3     /// <summary>
 4     /// 姓名
 5     /// </summary>
 6     public string Name { get; set; }
 7 
 8     /// <summary>
 9     /// 年龄
10     /// </summary>
11     public int Age { get; set; }
12 
13     /// <summary>
14     /// 电话表
15     /// </summary>
16     public List<string> TelTable { get; set; }
17 }
18 
19 
20 static void Linq8()
21 {
22     var source = new List<Guest>
23     {
24         new Guest{ Name="张三",Age=21,TelTable=new List<string>{"010-123456","13000000"}},
25         new Guest{ Name="李四",Age=22,TelTable=new List<string>{"021-123456","13100000"}},
26         new Guest{ Name="王五",Age=23,TelTable=new List<string>{"022-123456","13200000"}}
27     };
28     // 找电话簿中是021区号的客户
29     var query = from guest in source
30                 from tel in guest.TelTable
31                 where tel.Contains("021-")
32                 select guest;
33 
34     foreach (var guest in query)
35     {
36         Console.WriteLine("{0} 年龄:{1}", guest.Name, guest.Age);
37         foreach (var tel in guest.TelTable) { Console.WriteLine("     电话:{0}",tel); }
38     }
39 }
View Code

例7:多个 form 子句(交叉连接)

 1 static void Linq7()
 2 {
 3     int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };
 4     int[] numbersB = { 1, 3, 5, 7, 8 };
 5 
 6     var pairs =
 7         from a in numbersA
 8         from b in numbersB
 9         where a < b
10         select new { a, b };
11 
12     Console.WriteLine("交叉连接 a < b:");
13     foreach (var pair in pairs)
14     {
15         Console.WriteLine("{0} 小于 {1}", pair.a, pair.b);
16     }
17 }
View Code

 

三、排序

orderby 排序字段

orderby 排序字段 descending

Thenby(orderby 多个排序字段)

ThenByDescending  (orderby 多个排序字段 descending)

例1:orderby 排序字段

 1 static void Linq9()
 2 {
 3     string[] words = { "cherry", "apple", "blueberry" };
 4 
 5     var sortedWords =
 6         from w in words
 7         orderby w
 8         select w;
 9 
10     Console.WriteLine("单词排序 order by 单个排序字段:");
11     foreach (var w in sortedWords)
12     {
13         Console.WriteLine(w);
14     }
15 }
View Code

例2:orderby 排序字段 descending

 1 static void Linq10()
 2 {
 3     string[] words = { "cherry", "apple", "blueberry" };
 4 
 5     var sortedWords =
 6         from w in words
 7         orderby w descending
 8         select w;
 9 
10     Console.WriteLine("单词排序 order by 单个排序字段 从大到小:");
11     foreach (var w in sortedWords)
12     {
13         Console.WriteLine(w);
14     }
15 }
View Code

例3:Thenby(orderby 多个排序字段)

 1 static void Linq11()
 2 {
 3     string[] words = { "cherry", "appppp", "cherryo", "appppppple", "blueberry" };
 4 
 5     // 先按名称排,再按长度排序
 6     var sortedWords =
 7         from w in words
 8         orderby w,w.Length
 9         select w;
10 
11     Console.WriteLine("单词排序 ThenBy 多个排序字段");
12     foreach (var w in sortedWords)
13     {
14         Console.WriteLine(w);
15     }
16 }
View Code

例4:ThenByDescending  (orderby 多个排序字段 descending)

注意主要条件和次要的升降序不传递

 1 static void Linq12()
 2         {
 3             string[] words = { "cherry", "appppp", "cherryo", "appppppple", "blueberry" };
 4 
 5             // 先按名称排,再按长度排序
 6             var sortedWords =
 7                 from w in words
 8                 orderby w descending, w.Length descending
 9                 select w;
10 
11             Console.WriteLine("单词排序 ThenBy 多个排序字段");
12             foreach (var w in sortedWords)
13             {
14                 Console.WriteLine(w);
15             }
16         }
View Code

 

 

本文代码: http://pan.baidu.com/s/1dDnJ0tV

posted on 2014-12-04 00:01  ~江慕白~  阅读(437)  评论(0编辑  收藏  举报

导航