C#语法之Linq查询基础一

Linq做.Net开发的应该都用过,有些地方很复杂的逻辑用Linq很方便的解决。对于Linq to object、Linq to xml、Linq to sql、Linq to Entity(EF)都可以使用linq查询。不知道大家有没有想过为什么linq对这些都可以使用呢?统一的api适用这么多。其实主要还是IEnummerable<T>和IQueryable<T>两个接口。可能有人会问为什么是两个接口?这两个接口有什么区别或者联系呢?这又要引出来Enummerable、Queryable两个类。

一、IEnummerable<T>和IQueryable<T>区别

using System.Runtime.InteropServices;

namespace System.Collections
{
    //
    // 摘要:
    //     公开枚举数,该枚举数支持在非泛型集合上进行简单迭代。
    [ComVisible(true)]
    [Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
    public interface IEnumerable
    {
        //
        // 摘要:
        //     返回一个循环访问集合的枚举器。
        //
        // 返回结果:
        //     可用于循环访问集合的 System.Collections.IEnumerator 对象。
        [DispId(-4)]
        IEnumerator GetEnumerator();
    }
}
using System.Collections;
using System.Linq.Expressions;

namespace System.Linq
{
    //
    // 摘要:
    //     提供对未指定数据类型的特定数据源的查询进行计算的功能。
    public interface IQueryable : IEnumerable
    {
        //
        // 摘要:
        //     获取在执行与 System.Linq.IQueryable 的此实例关联的表达式目录树时返回的元素的类型。
        //
        // 返回结果:
        //     一个 System.Type,表示在执行与之关联的表达式目录树时返回的元素的类型。
        Type ElementType { get; }
        //
        // 摘要:
        //     获取与 System.Linq.IQueryable 的实例关联的表达式目录树。
        //
        // 返回结果:
        //     与 System.Linq.IQueryable 的此实例关联的 System.Linq.Expressions.Expression。
        Expression Expression { get; }
        //
        // 摘要:
        //     获取与此数据源关联的查询提供程序。
        //
        // 返回结果:
        //     与此数据源关联的 System.Linq.IQueryProvider。
        IQueryProvider Provider { get; }
    }
}

看它们两个的定义也能看出IQueryable继承IEnumerable,那两者什么区别呢?那我们可以看下两个接口的扩展类Enumerable、Queryable。

这两个类API相同,但是仔细看可以发现参数类型不一样,一个是Fuc<> 一个是Expression<Fuc<>>,其实Queryable是对Linq to sql、EF来使用的,虽然对外的api是一样的,但实现的原理是不一样的,一个是func<>lamdbs表达式,一个是Expression<Fuc<>>表达式树。

二、Linq基础查询

前面区分了两个接口,但API是一样的,查询用法也是一样,只是提高数据源的方式不一样。所以先抛开不一样的,求同存异嘛,下面主要是讲一下一样的部分。

上面是在百科上下的图片,虽然我也没看明白这个图,但在下面的几篇博客中我会把Linq查询的基本用法都列举出来,今天这篇博客只是对Linq做一简单介绍。

1.方法语法、查询语法

书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询语法(Query Expression)。

LINQ方法语法是非常灵活和重要的,我们在这里将描述使用链接查询运算符的方式来创建复杂的查询,方法语法的本质是通过扩展方法和Lambda表达式来创建查询。C# 3.0对于LINQ表达式还引入了声明式的查询语法,通过查询语法写出的查询比较类似于SQL查询。本篇会对LINQ方法语法进行详细的介绍。

当然,.NET公共语言运行库(CLR)并不具有查询语法的概念。所以,编译器会在程序编译时把查询表达式转换为方法语法,即对扩展方法的调用。所以使用方法语法会让我们更加接近和了解LINQ的实现和本质,并且一些查询只能表示为方法调用,如检索序列中的最大值、最小值元素的查询,他们在查询语法中就没有对应的实现。但另一方面,查询语法通常会比较简单和易读。不管怎样,这两种语法和互相补充和兼容的,我们可以在一个查询中混合使用方法语法和查询语法。

比如直接.List.where(p=>XX)这种是方法语法, from p in list XXXX这种是查询语法,查询语法还是转换为方法语法。

2.延迟计算

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] a = new int[] { 1,3,5,7,9,11,2,4,6};
            int b = 3;
            var result = from p in a where p % b == 0 select p;

            foreach (var m in result)
            {
                Console.WriteLine(m);
            }
            Console.WriteLine("-------------------------");
            b = 2;
            foreach (var m in result)
            {
                Console.WriteLine(m);
            }
            Console.ReadLine();
        }
    }
}

上面代码第一次是b=3,照数组a中3的倍数的数字,输出是2、9、6,但当把b改为2时,再次输出结果发现输出的是2、4、6,这个例子主要说明Linq是延迟计算,和其他地方的懒加载是一样的,声明的时候并不会直接计算出来,而是等到用时在计算。

时间: 2024-10-22 20:02:09

C#语法之Linq查询基础一的相关文章

C#语法之Linq查询基础二

上篇C#语法之Linq查询基础一基本把Linq介绍了一下,这篇主要是列举下它的几个常见用法. 在用之前先准备些数据,新建了两个类Student.Score,并通过静态方法提供数据. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinqDemo { public class Student {

LINQ查询基础

一.什么是LINQ LINQ是Language Integrate Query的缩写,意为语言集成查询,是微软在.Net Framework 4.5版中推出的主要特性之一. 它为开发人员提供了统一的数据查询模式,并与.Net开发语言(如C#和VB.Net)集成,很大程度上简化了数据查询的编码和调试工作,提供了数据查询的性能. LINQ中查询表达式访问的是一个对象,而该对象可以表示为各种类型的数据源.比如SQL Server数据库,XML文档,ADO.NET数据集,以及内存中的数据集合等. 在.N

LINQ查询语法

一.LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询语法(Query Expression) 1.方法语法:本质是通过扩展方法和Lambda表达式来创建查询 3.查询语法:查询比较类似于SQL查询 关系:.NET公共语言运行库(CLR)并不具有查询语法的概念.所以,编译器会在程序编译时把查询表达式转换为方法语法,即对扩展方法的调用.所以使用方法语法会让我们更加接近和了解LINQ的实现和本质,并且一些查询只能表示为方法调用,如检索序列中的最大值.最小值元素的查询,他们

C#基础:LINQ 查询函数整理

1.LINQ 函数 1.1.查询结果过滤 :where() Enumerable.Where() 是LINQ 中使用最多的函数,大多数都要针对集合对象进行过滤,因此Where()在LINQ 的操作上处处可见,Where()的主要任务是负责过滤集合中的数据:其原型如下: 1 public static IEnumerbale<TSouce> Where<TSource>(this IEnumerable<Tsource> source,Func<TSource,bo

linq查询语法和方法

1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: using (NorthwindDataContext db=new NorthwindDataContext()) { //linq查询语法(基本语法) var query = from e in db.Employees where e.FirstName.StartsWith("M") select e; //linq方法语法(基本方法) v

LINQ查询表达式(1) - 查询表达式基础

什么是查询?它有什么用途? "查询"是指一组指令,这些指令描述要从一个或多个给定数据源检索的数据以及返回的数据应该使用的格式和组织形式. 查询不同于它所产生的结果.通常,源数据会在逻辑上组织为相同种类的元素序列. SQL 数据库表包含一个行序列. 与此类似,ADO.NET DataTable 包含一个 DataRow 对象序列. 在 XML 文件中,有一个 XML 元素"序列"(不过这些元素按分层形式组织为树结构). 内存中的集合包含一个对象序列.从应用程序的角度来

LINQ 查询表达式(C# 编程指南)

语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言)的基础上.  借助于 LINQ,查询现在已是高级语言构造,就如同类.方法.事件等等. 对于编写查询的开发人员来说,LINQ 最明显的"语言集成"部分是查询表达式.  查询表达式是使用 C# 3.0 中引入的声明性查询语法编写的.  通过使用查询语法,您甚至可以使用最少的代码对数据源执行复杂的筛选.排序和分组操作.  您使用相同的

LINQ查询知识总结:案例分

案例:汽车表car,系列表brand,厂商表productor private MyCarDataContext  _Context = new MyCarDataContext(); (1)查询全部汽车信息 var list = _Context.Car; LINQ语法:var list = from p in _Context.Car select p; (2)简单筛选行:查询车系代号是 b002的所有车 关键点:"==" var list = _Context.Car.Where

Linq学习之旅——LINQ查询表达式

1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 LINQ的全称是Language Integrated Query,中文译成“语言集成查询”.LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了三大组件来实现这个封装,分别是LINQ to Object.LINQ to ADO.NET.LINQ to XML.它们和.NET语言的关系如下: