欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

轻松掌握 LINQ:from 到 where,再到 select 的全解析,别忘了 Any、All、Take、Skip 和 First/FirstOrDefault

最编程 2024-08-10 17:53:35
...

LINQ;Language Integrated  Query

命名空间:using System.Linq;

   static void Main(string[] args)
        {
            string[] names = {"RH","AHRH","ABRDH","SREHGS","BXDNT","AEGGA","AEGS","EGESA","AEE" };
            var queryResult = from n in names where n.StartsWith("A") select n;
            Console.WriteLine("Names begging with A:");
            foreach (var item in queryResult )//这样的LINQ 查询结果是可以枚举的,foreach 迭代结果
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

var queryResult = from n in names where n.StartsWith("A") select n;

依次说明语句的实现:
var queryResult 
var声明一般的变量类型,适合LINQ的查询结果,编译器根据LINQ查询返回的对象类型推断返回类型;若查询返回多个条目,返回的就是一个对象集合(在技术上并不是集合,看起来像集合而已)

from n in names
本例中的数据源是前面声明的字符串数组names。变量n 只是数据源中某一元素的代表,类似于foreach 语句后面的变量名。指定from 子句,就可以只查找集合的一个子集,而不用迭代所有的元素.


迭代是指:LINQ 数据源必须是可枚举的——即必须是数组或集合,以便从中选择出一个或多个元素。
where n.StartsWith("A")
用where 子句指定查询的条件。
可以在where 子句中指定能应用于数据源中各元素的任意布尔(true 或false)表达式。实际上,where 子句是可选的,甚至可以忽略,但在大多数情况下,都要指定where 条件,把结果限制为我们需要的数据。where 子句称为LINQ 中的限制运算符, 因为它限制了查询的结果。

LINQ 提供了一组聚合运算符,可用于分析查询的结果,而无需迭代所有结果
            int [] in1={1,2,3,4,65,4,3,2,25,15123,53};
            var IntResult = in1.OrderBy(n => n).Where(n=> n>10);// 取大于10的数字并排序
            IntResult.Sum();
            IntResult.Max();
            IntResult.Min();
            IntResult.Count();
            IntResult.Average();
Console.WriteLine(queryResults.Sum(n => (long) n));
//使用Sum()方法的这个版本会导致溢出错误,因为数据集中的数字太多,它们的总和太大,不能放在Sum()
方法的无参数重载版本返回的标准的32 位int 中。Lambda 表达式(long)n,运行存放64位的,不会出现溢出。

select n
select 子句指定结果集中包含哪些元素。
select 子句是必须的,因为必须指定结果集中有哪些元素。

Where<>方法和大多数其他方法都是扩展方法(在Where<>方法的右边显示了一个文档说明,它以extension 开头)。因为如果在顶部注释掉了指令using System.Linq,Where<>、Union<>、Take<>和大多数其他方法就会从列表中消失。上一个示例使用的for..where..select 查询表达式由C#编译器转换为这些方法的一系列调用。使用LINQ 方法语法时,就直接调用这些方法。

LINQ中有查询语法和方法语法


方法语法:大多数使用方法语法的LINQ 方法都要求传送一个方法或函数,来计算查询表达式。方法/函数参数以委托的形式传送,它一般引用一个匿名方法。

var queryResult = names.Where(n=>n.StartsWith ("A"));
C#编译器把Lambda 表达式n => n.StartsWith("S"))编译为一个匿名方法,Where()在names 数组的每个元素上执行这个方法。如果Lambda 表达式给某个元素返回true,该元素就包含在Where()返回的结果集中。C#编译器从输入数据源(这里是names 数组)的定义中推断,该Where()方法应把string作为每个元素的输入类型。


var queryResult = from n in names where n.StartsWith("A") orderby n select n;
与where 子句一样,orderby 子句也是可选的。只要添加一行,就可以给任意查询的结果排序,如果不使用LINQ,就需要添加至少几行代码和几个方法或集合,来存储根据选择实现的排序算法重新排序的结果。如果有多个需要排序的类型,就需要为每个类型实现一系列排序方法。而使用LINQ 不需要做这些工作,只需在查询语句中添加一个子句即可

var queryResult = from n in names  orderby n select n;
where是可选的,这样就是对整个names进行排序
Select

投影(projection)是在LINQ 查询中从其他数据类型中创建新数据类型的技术术语。select 关键字是投影运算符,前面的示例中就使用了这个关键字。如果熟悉SQL 数据查询语言中的SELECT 关键字,就很熟悉从数据对象中选择某个字段的操作,而不是选择整个对象.
 

var queryResult = from n in names where n.StartsWith("A") orderby n select n.ToLower ();//将选出的字符小写
但是,与SQL 不同,LINQ 不允许在select 子句中有多个字段。这表示select c.City, c.Country, c.Sales会生成一个编译错误(需要分号),因为select 子句在其参数列表中只有一项。select new { c.City, c.Country, c.Sales }

Select单值查询
var queryResult = (from n in names where n.StartsWith("A") orderby n select n.ToLower ()).Distinct ();  //去掉重复的 


LINQ 提供了两个布尔方法:
Any()和All(),它们可以快速确定对于数据而言,某个条件是true还是false。因此很容易地找到数据。
bool bo=IntResult.Any(n=>n>100); //是否有数据>100
bool bo=IntResult.All(n=>n>100);//是否所有的数据>100

Take()与Skip()
LINQ 方法是Take(),它可以从查询结果中提取前n 个结果。实际上,这个方法需要和orderby 子句一起使用,才能获得前n 个结果。但orderby 子句并不是必需的,因为有时知道数据已经按指定的顺序排列好了,或者只需要前n 个结果,而不必考虑它们的顺序。
Take()的反面是Skip(),它可以跳过前n 个结果,返回剩余的结果

First()与FirstOrDefault
LINQ 通过First()方法提供了这个功能,它返回结果集中第一个匹配给定条件的元素。如果没有,LINQ 还提供了方法FirstOrDefault()来处理这种情况,而无需添加错误处理代码。


LINQ 在查询语法中提供了Join 命令.