`
terryfeng
  • 浏览: 504493 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

LINQ 标准的查询操作符 复合的 from 子句

阅读更多

复合的  from 子句

 

如果需要根据对象的一个成员进行过滤,而该成员本身是一个集合,就可以使用复合的 from 子句。

Racer 类定义了一个属性 Cars, Cars  是一个字符串数组。

要过滤驾驶 Ferrari  的所有冠军, 可以使用如下所示的 LINQ 查询。

第一个 from  子句访问从 Formyla1.GetChampions()返回的Racer  对象,

第二个 from  子句访问 Racer 类的属性 Cars,返回所有的string  类型的赛车。

接着在 Where  子句中使用这些赛车过滤驾驶 Ferrari 的所有车手

并使用LastName升序

 

private static void CompoundFrom()
        {
            var fd = from r in Formula1.GetChampions()
                     from c in r.Cars
                     where c == "Ferrari"
                     orderby r.LastName
                     select r.FirstName + " " + r.LastName;

            foreach (var racer in fd)
            {
                Console.WriteLine(racer);
            }
        }
结果把Cas中带有Ferrari 的9个车手名字列了出来:

image

C#编译器把复合的 from 子句和 LINQ  查询转换为 SelectMany()扩展方法。SelectMany()可用于迭代集合
中的集合。示例中 SelectMany()方法的重载版本如下所示:

public static IEnumerable < TResult > SelectMany < TSource, TCollection, TResult > (

this IEnumerable < TSource > source,
Func < TSource, IEnumerable < TCollection > > collectionSelector,
Func < TSource, TCollection, TResult > resultSelector);

下面的程序就是调用这个扩展方法,说明如下:
1.第一个参数是隐式参数,从 GetChampions()方法中接收 Racer 对象序列。

2.第二个参数(r => r.Cars)是 collectionSelector 委托,它定义了内部集合。在λ表达式r=>r.Cars  中,应返回赛车集合。r 本身是R集合,用这个又得到了Cars集合

3.第三个参数是一个委托,现在为每个赛车调用该委托,接收 Racer 和 Car 对象。

4.λ表达式创建了一个匿名类型,它带 Racer1  和 Car1  属性。匿名对象的 Racer1属性附上了r,Car1属性附上了c,属性名随意定的

5.这个SelectMany()方法的结果是摊平了赛手和赛车的层次结构,

5.为每辆赛车返回匿名类型的一个新对象集合。

这个新集合传送给Where()方法,过滤出驾驶 Ferrari  的赛手。最后,调用OrderBy()和Select()方法:

 

/// <summary>
        /// 复合的from子句
        /// </summary>
        private static void CompoundFrom()
        {
            var fd = Formula1.GetChampions().
                SelectMany( r => r.Cars, (r, c) => new { Racer1 = r, Car1 = c }).
                  Where(r => r.Car1 == "Ferrari").
                  OrderBy(r => r.Racer1.LastName).
                  Select(r => r.Racer1.FirstName + " " + r.Racer1.LastName);
            foreach (var racer in fd)
            {
                Console.WriteLine(racer);
            }


        }

 

结果和上面一样

把 SelectMany()泛型方法解析为这里使用的类型,所解析的类型如下所示。

在这个例子中,数据源是 Racer 类型,所过滤的集合是一个string  数组,当然所返回的匿名类型的名称是未知的,

这里显示为 TResult:

public static IEnumerable < TResult > SelectMany < Racer, string, TResult > (
this IEnumerable < Racer > source,   //Formula1.GetChampions()的结果
Func < Racer, IEnumerable < string > > collectionSelector,  // SelectMany( r => r.Cars,中的 r => r.Cars, 返回结果集为 IEnumerable < string >
Func < Racer, string, TResult > resultSelector);  //(r, c) => new { Racer1 = r, Car1 = c }).   // r, c, => new {} 返回结果为
TResult 到r 表达式左式的第一个参数r

查询仅从 LINQ 查询转换为扩展方法,所以结果与前面的相同。

分享到:
评论

相关推荐

    linq标准查询操作符

    本文主要讨论的是LINQ的标准查询操作符,这些操作符用于构建查询表达式,对数据进行过滤、转换、排序等操作。 首先,我们来看投影操作符,其中最常见的是`Select`。`Select`用于从输入序列中选择新的元素或对象。在...

    LINQ标准查询操作符.pdf

    ### LINQ标准查询操作符详解 #### 一、投影操作符 **1. Select** - **定义**: `Select`操作符用于对集合中的每个元素应用指定的函数,并将结果返回为一个新的序列。此操作通常用来从原始数据集中提取特定属性或...

    LINQ面试题

    10. LINQ扩展方法:掌握LINQ标准查询操作符和如何编写自定义扩展方法。 针对这些知识点,面试中可能会提出的具体问题包括: - 如何使用LINQ来查询一个集合,并找出符合特定条件的元素? - 在LINQ中,如何实现分页...

    关于linq的101实例

    C# 5.0引入了异步LINQ操作符,如`ToListAsync()`和`ToObservableAsync()`,它们支持在查询中进行异步操作,从而改善UI响应。 ### 8. 扩展方法和LINQ LINQ的实现主要依赖于扩展方法,这是C#中一种特殊的方法,可以被...

    使用LINQ查询,linq基础

    这些操作符分别用于合并、查找共同元素和找出不共享的元素: ```csharp var uniqueNames = list1.Except(list2); var commonNames = list1.Intersect(list2); var combinedNames = list1.Union(list2); ``` ### ...

    Linq学习教程 Linq学习教程

    3. 查询操作符:LINQ包含一系列操作符,如Where、Select、GroupBy、OrderBy等,用于过滤、转换和排序数据。 **二、LINQ查询表达式** 1. 从简单查询开始:例如,`var query = from item in collection where item....

    100个linq例子

    这只是LINQ功能的一小部分,它还包括其他操作符如`Select`(用于转换元素)、`Join`(用于合并不同数据源)、`GroupBy`(用于分组数据)、`OrderBy`/`OrderByDescending`(用于排序)以及`Sum`, `Average`, `Count`,...

    LINQ从基础到项目实战

    ### 三、LINQ操作符 1. **选择(Select)**:用于从数据源中选择元素,相当于SQL的SELECT。 2. **过滤(Where)**:根据条件过滤元素,相当于SQL的WHERE子句。 3. **排序(OrderBy/OrderByDescending)**:对元素...

    Linq技术讲义----语言集成查询

    3. **执行查询**:执行查询以获取结果,可以是立即执行(即查询语句后面跟一个迭代操作符如foreach)或者延迟执行(仅在需要时执行,如将查询结果赋值给变量)。 【查询表达式的结构】: - `from`子句:定义数据源...

    linq中文版文档 linq的必备手册

    四、LINQ操作符 1. **Select**:用于投影,根据指定的函数映射每个元素。 2. **Where**:用于过滤,根据指定的条件筛选元素。 3. **GroupBy**:用于对数据进行分组,返回一个IGrouping, TElement&gt;类型的集合。 4. **...

    什么是Linq表达式什么是Lambda表达式.pdf

    2. 当需要使用到查询表达式特有的操作符,例如Group By,或者在需要构建复杂的查询逻辑时,查询表达式能够提供更清晰的结构来表达这些逻辑。 总之,无论是查询表达式还是点标记,它们都是实现LINQ查询的不同方式。...

    语言集成查询(LINQ)之入门篇教程

    - **Lambda表达式**:用作查询中的函数或委托,简化了操作符的定义。 **3. LINQ查询的基本结构** - **from子句**:指定数据源和范围变量,范围变量在查询中代表数据源中的每个元素。 - **where子句**:过滤数据,...

    Professional LINQ

    5. **查询操作符**:探索各种内置的查询操作符,如Select、Where、GroupBy、Join和OrderBy等,以及如何自定义查询操作符。 6. **集合操作与并行查询**:学习如何使用LINQ对集合进行转换、过滤和合并,以及如何利用...

    Linq体验系列文章打包

    3. **多表关联**:`Join`操作符在处理多表查询时非常关键,它使得在多个数据集之间建立关联变得简单,这对于数据库查询尤其重要。 4. **LINQ to SQL**:这是LINQ的一个具体实现,允许开发者直接在SQL Server数据库...

    EntityFramework数据持久化复习资料5、LINQ概述与应用(超终点)(包含源码)

    - 扩展方法使得LINQ操作符能够被添加到任何类型上,而无需修改该类型。 6. **示例代码** - 使用LINQ查询表达式与EF结合的例子,展示如何从数据库中选择、过滤、排序和投影数据。 - 如:`var query = from ...

    linq to sql 语法 学习笔记

    `Where` 操作符用于过滤数据,其功能类似于 SQL 中的 `WHERE` 子句。它可以接受不同的形式: 1. **简单形式**: - 示例1:筛选伦敦的客户 ```csharp var q = from c in db.Customers where c.City == "London" ...

    LINQ to SQL手册

    8. **Concat/Union/Intersect/Except**:集合操作符,用于合并(`Concat`)、合并并去除重复(`Union`)、找出两个集合的交集(`Intersect`)和差集(`Except`)。 9. **Top/Bottom and Paging**:`Top` 用于获取...

    Linq资料,叫你一步一步学习Linq

    在LINQ中,你可以使用查询表达式(也称为“查询语法”)或方法链(也称为“操作符语法”)来编写查询。 首先,我们来看查询表达式。查询表达式以`from`关键字开始,接着指定一个或多个源和投影,然后是`where`子句...

Global site tag (gtag.js) - Google Analytics