IQueryable<T> 集合。 

IQueryable<T> 。

IQueryable<T> ,为什么也可进行LINQ查询呢?

二、查询可能会执行三种操作

  • 查询然后可能以各种方式对返回的序列进行排序或分组,如下面的示例所示(假定 scores 是 int[]):

IEnumerable<int> highScoresQuery = from score in scores where score > 80 orderby score descending select score;

  • 请注意 highScoresQuery 的新类型。

 

IEnumerable<string> highScoresQuery2 =
    from score in scores
    where score > 80
    orderby score descending
    select $"The score is {score}";
  • 检索有关源数据的单独值,如:

 

    • 与特定条件匹配的元素数。

    • 具有最大或最小值的元素。

    • 例如,下面的查询从 scores 整数数组返回大于 80 的分数的数量:

int highScoreCount =
    (from score in scores
     where score > 80
     select score)
     .Count();

这种方法更具可读性,因为它使存储查询的变量与存储结果的查询分开。

IEnumerable<int> highScoresQuery3 =
    from score in scores
    where score > 80
    select score;

int scoreCount = highScoresQuery3.Count();

三、查询表达式

查询表达式必须以 from 子句开头,且必须以 select 或 group 子句结尾。into 关键字,使 join 或 group 子句的结果可以充当相同查询表达式中的其他查询子句的源。

该查询以 select子句结尾。

 

static void Main()
{
    // Data source.
    int[] scores = { 90, 71, 82, 93, 75, 82 };

    // Query Expression.
    IEnumerable<int> scoreQuery = //query variable
        from score in scores //required
        where score > 80 // optional
        orderby score descending // optional
        select score; //must end with select or group

    // Execute the query to produce the results
    foreach (int testScore in scoreQuery)
    {
        Console.WriteLine(testScore);
    }                  
}
// Outputs: 93 90 82 82

查询变量

在上面的示例中,scoreQuery 是查询变量,它有时仅仅称为查询。查询变量可以存储采用查询语法、方法语法或是两者的组合进行表示的查询,而不是查询的结果。

开始查询表达式

因为范围变量是强类型,所以可以使用点运算符访问该类型的任何可用成员。

IEnumerable<Country> countryAreaQuery =
    from country in countries
    where country.Area > 500000 //sq km
    select country;

范围变量一直处于范围中,直到查询使用分号或 continuation 子句退出。

若要查询每个 Country 中的 City 对象,请使用两个 from 子句,如下所示:

IEnumerable<City> cityQuery =
    from country in countries
    from city in country.Cities
    where city.Population > 10000
    select city;

结束查询表达式

查询表达式必须以 group 子句或 select 子句结尾。

group 子句

例如,下面的查询会创建包含一个或多个 Country 对象并且其键是 char 值的组的序列。

 

var queryCountryGroups =
    from country in countries
    group country by country.Name[0];

select 子句

orderby 子句只按新顺序对元素进行排序,而 select 子句生成重新排序的 Country 对象的序列。

 

IEnumerable<Country> sortedQuery =
    from country in countries
    orderby country.Area
    select country;

请注意,新对象使用对象初始值设定项进行初始化。

// Here var is required because the query
// produces an anonymous type.
var queryNameAndPop =
    from country in countries
    select new { Name = country.Name, Pop = country.Population };

使用“into”进行延续

若要执行这些附加操作,需要由 countryGroup 表示的延续。

 

// percentileQuery is an IEnumerable<IGrouping<int, Country>>
var percentileQuery =
    from country in countries
    let percentile = (int) country.Population / 10_000_000
    group country by percentile into countryGroup
    where countryGroup.Key >= 20
    orderby countryGroup.Key
    select countryGroup;

// grouping is an IGrouping<int, Country>
foreach (var grouping in percentileQuery)
{
    Console.WriteLine(grouping.Key);
    foreach (var country in grouping)
        Console.WriteLine(country.Name + ":" + country.Population);
}

筛选、排序和联接

任何可选子句都可以在查询正文中使用零次或多次。

 

where 子句

以下示例中的 where 子句具有一个谓词及两个条件。

IEnumerable<City> queryCityPop =
    from city in cities
    where city.Population < 200000 && city.Population > 100000
    select city;

orderby 子句

然后使用 Population 属性执行次要排序。

 

IEnumerable<Country> querySortedCountries =
    from country in countries
    orderby country.Area, country.Population descending
    select country;

ascending 关键字是可选的;如果未指定任何顺序,则它是默认排序顺序。 

join 子句

筛选出其 Category 不与 categories 中的任何字符串匹配的产品。select 语句会投影其属性取自 cat 和 prod 的新类型。

 

var categoryQuery =
    from cat in categories
    join prod in products on cat equals prod.Category
    select new { Category = cat, Name = prod.Name };

还可以通过使用 into 关键字将 join 操作的结果存储到临时变量中来执行分组联接。

let 子句

在下面的示例中,范围变量 firstName 存储 Split 返回的字符串数组的第一个元素。

string[] names = { "Svetlana Omelchenko", "Claire O'Donnell", "Sven Mortensen", "Cesar Garcia" };
IEnumerable<string> queryFirstNames =
    from name in names
    let firstName = name.Split(' ')[0]
    select firstName;

foreach (string s in queryFirstNames)
    Console.Write(s + " ");
//Output: Svetlana Claire Sven Cesar

查询表达式中的子查询

例如,下面的查询演示在 select 语句用于检索分组操作结果的查询表达式。

 

var queryGroupMax =
    from student in students
    group student by student.GradeLevel into studentGroup
    select new
    {
        Level = studentGroup.Key,
        HighestScore =
            (from student2 in studentGroup
             select student2.Scores.Average())
             .Max()
    };

 

相关文章:

  • 2022-12-23
  • 2021-11-06
  • 2021-05-24
  • 2021-05-26
  • 2021-08-22
  • 2022-01-01
  • 2021-08-29
猜你喜欢
  • 2022-12-23
  • 2021-09-08
  • 2021-07-09
  • 2021-09-17
  • 2021-11-19
  • 2021-12-28
  • 2022-12-23
相关资源
相似解决方案