Linq 查询

查询表达式

查询表达式可用于查询并转换所有启用了 LINQ 的数据源中的数据。 例如,通过一个查询即可检索 SQL 数据库中的数据,并生成 XML 流作为输出。

查询表达式易于掌握,因为它们使用了许多熟悉的 C# 语言构造。

查询表达式中的变量全都是强类型,尽管在许多情况下,无需显式提供类型,因为编译器可以推断出。

只有在循环访问查询变量后,才会执行查询(例如,在 foreach 语句中)。

在编译时,查询表达式根据 C# 规范规则转换成标准查询运算符方法调用。 可使用查询语法表示的任何查询都可以使用方法语法进行表示。 不过,在大多数情况下,查询语法的可读性更高,也更为简洁。

通常,我们建议在编写 LINQ 查询时尽量使用查询语法,并在必要时尽可能使用方法语法。 这两种不同的形式在语义或性能上毫无差异。 查询表达式通常比使用方法语法编写的等同表达式更具可读性。

一些查询操作(如 Count 或 Max)没有等效的查询表达式子句,因此必须表示为方法调用。 可以各种方式结合使用方法语法和查询语法。

查询表达式可被编译成表达式树或委托,具体视应用查询的类型而定。 IEnumerable 查询编译为委托。 IQueryable 和 IQueryable 查询编译为表达式树。

示例

 // 1.数据源
            int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

            // 2.创建查询
            // numQuery 是一个隐式泛型
            var numQuery =
                from num in numbers
                where (num % 2) == 0
                select num;

            // 3.执行查询
            foreach (int num in numQuery)
            {
                Console.Write(num);
            }



            //延时执行{0,5},0:值,5:延时次数
            Console.WriteLine();
            foreach (int num in numQuery)
            {
                Console.Write("{0,5} ", num);
            }


            //强制立即执行
            Console.WriteLine();
            var evenNumQuery =
                from num in numbers
                where (num % 2) == 0
                select num;
            int evenNumCount = evenNumQuery.Count();
            Console.WriteLine(evenNumCount);

            //强制立即执行:ToList()
            List<int> numQuery2 =
                (from num in numbers
                 where (num % 2) == 0
                 select num).ToList();
            foreach (int num in numQuery2)
            {
                Console.Write(num);
            }

            //强制立即执行: ToArray()
            var numQuery3 =
                (from num in numbers
                 where (num % 2) == 0
                 select num).ToArray();

            foreach (int num in numQuery3)
            {
                Console.Write(num);
            }

查询三步骤

  1. 数据源
  2. 创建查询
  3. 执行查询

数据源

基本规则 :LINQ 数据源是支持泛型 IEnumerable 接口或从中继承的接口的任意对象。

上例中,数据源是一个数组,因此它隐式支持泛型 IEnumerable 接口。 这一事实意味着该数据源可以用 LINQ 进行查询。 查询在 foreach 语句中执行,且 foreach 需要 IEnumerable 或 IEnumerable。 支持 IEnumerable 或派生接口(如泛型 IQueryable)的类型称为可查询类型 。

可查询类型不需要进行修改或特殊处理就可以用作 LINQ 数据源。 如果源数据还没有作为可查询类型出现在内存中,则 LINQ 提供程序必须以此方式表示源数据。 例如,LINQ to XML 将 XML 文档加载到可查询的 XElement 类型中:

// 从XML文档创建数据源。
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");

借助 LINQ to SQL,首先手动或使用 Visual Studio 中的 LINQ to SQL 工具在设计时创建对象关系映射。 针对这些对象编写查询,然后由 LINQ to SQL 在运行时处理与数据库的通信。 下例中,Customers 表示数据库中的特定表,而查询结果的类型 IQueryable 派生自 IEnumerable。

Northwnd db = new Northwnd(@"c:\northwnd.mdf");

// 查询伦敦的客户
IQueryable<Customer> custQuery =
    from cust in db.Customers
    where cust.City == "London"
    select cust;

备注:
支持非泛型 IEnumerable 接口的类型(如 ArrayList)还可用作 LINQ 数据源。

查询

查询指定要从数据源中检索的信息。 查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化。 查询存储在查询变量中,并用查询表达式进行初始化。 为使编写查询的工作变得更加容易,C# 引入了新的查询语法。

上一个示例中的查询从整数数组中返回所有偶数。 该查询表达式包含三个子句:from、where 和 select。 (如果熟悉 SQL,会注意到这些子句的顺序与 SQL 中的顺序相反。)from 子句指定数据源,where 子句应用筛选器,select 子句指定返回的元素的类型。 语言集成查询 (LINQ) 一节中详细讨论了这些子句和其他查询子句。 目前需要注意的是,在 LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。 它只是存储在以后某个时刻执行查询时为生成结果而必需的信息。

备注:还可以使用方法语法来表示查询。

强制立即执行

可以通过在紧跟查询表达式之后的位置放置一个 foreach 循环来强制执行查询。 但是,通过调用 ToList 或 ToArray,也可以将所有数据缓存在单个集合对象中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中,LINQ(Language Integrated Query)是一种用于查询和操作各种数据源的语言集成查询技术。LINQ提供了一种统一的查询语法,可以用于查询对象集合、数据库、XML文档等各种数据源。 在给出的引用中,引用\[1\]展示了如何使用LINQ进行查询结果排序。在示例中,通过使用`orderby`关键字,可以按照指定的字段进行排序。例如,`orderby e.LevelNum, e.Name, e.Age descending`表示按照级别、姓名和年龄进行排序,其中`descending`表示降序排序。 引用\[2\]展示了如何使用LINQ进行联合查询。通过使用`from`关键字和`select`关键字,可以将两个集合进行联合查询,并输出结果。例如,`from e in empArray from l in empLeArray select new { e, l }`表示将`empArray`和`empLeArray`两个集合进行联合查询,并输出结果。 引用\[3\]展示了LINQ支持的查询环境之一,即对象集合。在示例中,通过创建`List<string>`、`Dictionary<string, string>`、`ArrayList`和`Hashtable`等对象集合,可以在LINQ中进行查询操作。 综上所述,C#中的LINQ查询可以通过使用`orderby`关键字进行结果排序,使用`from`和`select`关键字进行联合查询,并支持在对象集合中进行查询操作。 #### 引用[.reference_title] - *1* *2* *3* [C#之Linq查询表达式](https://blog.csdn.net/weixin_49251429/article/details/123671040)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值