C# LINQ

测试代码链接

什么是LINQ?
语言集成查询(Language Integrated Query,LINQ)在C#编程语言中集成了查询语法,可以用相同的语法访问不同的数据源。LINQ提供了不同数据源的抽象层,所以可以使用相同的语法。
在这里插入图片描述


LINQ特点:
熟悉的语言:开发人员不必为每种类型的数据源或数据格式学习新的查询语言。
更少的编码:与更传统的方法相比,它减少了要编写的代码量。
增强代码可读性:LINQ使代码更具可读性,因此其他开发人员可以很容易地理解和维护它。
查询多个数据源的标准化方式:相同的LINQ语法可用于查询多个数据源。
查询的编译时安全性:它在编译时提供对象的类型检查。
智能感知支持:LINQ为泛型集合提供智能感知。

我们可以为实现IEnumerable或IQueryable接口的类编写LINQ查询。System.Linq名称空间包括Linq查询所需的接口。
LINQ查询为实现IEnumerable或IQueryable接口的类使用扩展方法。Enumerable和Queryable是两个静态类,它们包含用于编写LINQ查询的扩展方法。


相关文档
System.Linq
IEnumerable
IQueryable
Enumerable类中包含的扩展方法,可与c#或VB.Net中的通用集合一起使用。
Queryable类中可用的扩展方法可以与各种本地或第三方数据提供程序一起使用。


两种基本的方法
两种基本的方法可以为IEnumerable集合或IQueryable数据源编写LINQ查询。
查询语法或查询表达式语法:询语法类似于数据库的SQL(结构化查询语言)。

from <range variable> in <IEnumerable<T> or IQueryable<T> Collection>
<Standard Query Operators> <lambda expression>
<select or groupBy operator> <result formation>

方法语法或方法扩展语法
var result = stringList.Where(s => s.Contains(“Tutorials”));


LINQ中的标准查询操作符
LINQ中的标准查询操作符实际上是IEnumerable和IQueryable类型的扩展方法。它们在System.Linq中定义。可列举的,来。可查询类。在LINQ中有超过50种标准的查询操作符,它们提供了过滤、排序、分组、聚合、连接等不同的功能。
Filtering>>Where, OfType
Sorting>>OrderBy, OrderByDescending, ThenBy, ThenByDescending, Reverse
Grouping>>GroupBy, ToLookup
Join>>GroupJoin, Join
Projection>>elect, SelectMany
Aggregation>>Aggregate, Average, Count, LongCount, Max, Min, Sum
Quantifiers>>All, Any, Contains
Elements>>ElementAt, ElementAtOrDefault, First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefault
Set>>Distinct, Except, Intersect, Union
Partitioning>>Skip, SkipWhile, Take, TakeWhile
Concatenation>>Concat
Equality>>SequenceEqual
Generation>>DefaultEmpty, Empty, Range, Repeat
Conversion>>AsEnumerable, AsQueryable, Cast, ToArray, ToDictionary, ToList
参考API文档


Expression in LINQ
LINQ引入了名为Expression的新类型,它表示强类型的lambda表达式。这意味着lambda表达式也可以被分配给表达式类型。
.net编译器将分配给expression 的lambda表达式转换成表达式树,而不是可执行代码。这个表达式树被远程LINQ查询提供程序用作数据结构来构建运行时查询(例如LINQ-to- sql, EntityFramework或任何其他实现IQueryable接口的LINQ查询提供程序)。

Define an Expression
Func<Student, bool> isTeenAger = s => s.Age > 12 && s.Age < 20;

可以用Expresson包装Func委托,将上面的Func类型委托转换为表达式
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20;
Expression<Action> printStudentName = s => Console.WriteLine(s.StudentName);

Invoke an Expression
可以以与委托相同的方式调用由表达式包装的委托,但首先需要使用compile()方法对其进行编译。Compile()返回Func或Action类型的delegateof,以便可以像调用委托一样调用它。
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20;
//compile Expression using Compile method to invoke it as Delegate
Func<Student, bool> isTeenAger = isTeenAgerExpr.Compile();
//Invoke
bool result = isTeenAger(new Student(){ StudentID = 1, StudentName = “Steve”, Age = 20});


Expression Tree(后续补充)
表达式树顾名思义就是用树形数据结构排列的表达式。表达式树中的每个节点都是一个表达式。
表达式树是lambda表达式在内存中的表示。它保存查询的实际元素,而不是查询的结果。
在LINQ to Objects中,扩展方法需要将一个委托类型作为参数,这样就可以将lambda表达式赋予参数。
lambda表达式也可以赋予Expression类型的参数。C#编译器根据类型给lambda表达式定义不同的行为。如果类型是Expression,编译器就从lambda表达式中创建一个表达式树,并存储在程序集中。
这样就可以在运行期间分析表达式树,并进行优化,以便于查询数据源。
表达式树相关博客


延迟执行
延迟执行意味着表达式的求值被延迟到实际需要它的实现值时。它通过避免不必要的执行大大提高了性能。
延迟执行适用于任何内存收集以及远程LINQ提供程序,如LINQ-to- sql、LINQ-to- entities、LINQ-to- xml等等。
在执行查询语法代码时没有执行查询语句;查询在使用foreach循环进行迭代时被具体化并执行。这叫做延迟执行。
延迟执行对每次执行重新评估;这称为惰性求值。这是延迟执行的主要优点之一:它总是为您提供最新的数据。
可以使用c#的yield关键字为您的IEnumerable定制扩展方法实现延迟执行。


立即执行
立即执行是延迟执行的反面。它强制执行LINQ查询并立即获得结果。'To’转换操作符执行给定的查询并立即给出结果。
ToList()扩展方法立即执行查询并返回结果。
IList teenAgerStudents = studentList.Where(s => s.age > 12 && s.age < 20).ToList();


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值