LINQ 查询为最常用的操作符定义了一个声明语法。还有许多标准查询操作符
下面是 LINQ 定义的标准查询操作符。
下面开始学习这些查询
添加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 />"); } }
冯瑞涛