LINQ(Language Integrated Query,语言查询语言)提供了不同数据源的抽象层,可以用相同的语法访问不同的数据源。LINQ允许查询表达式以统一的方式来操作任何通过扩展方法直接或间接实现了IEnumerable接口的对象、关系数据库、DataSet或者XML文档。

一. 核心LINQ程序集

核心LINQ程序集:

程序集 描述
System.Core.dll 定义了代表核心LINQ API的类型。这个程序集必须访问。
System.Data.Linq.dll 提供了使用LINQ访问关系数据库所需的功能(LINQ to SQL)。
System.Data.DataSetExtensions.dll 定义了许多类型来将ADO.NET类型融入LINQ编程范式(LINQ to DataSet)。
System.Xml.Linq.dll 提供了使用LINQ处理XML文档数据所需的功能(LINQ to XML)。

二. 标准查询操作符

LINQ的标准查询操作符如下:

标准查询操作符 说明
Where
OfType<TResult>
筛选操作符定义了返回元素的条件。在Where查询操作符中,可以使用谓词,如Lambda表达式定义的谓词,来返回布尔值。ofType<TResult>根据类型筛选元素,只返回TRsult类型的元素。
Select
SelectMany
投射操作符用于把对象转换为另一个类型的新对象。Select和SelectMany定义了根据选择器函数选择结果集的投射。
OrderBy
ThenBy
OrderByDescending
ThenByDescending
Reverse
排序操作符改变所返回的元素的顺序。OrderBy按升序排序,OrderByDescending按降序排序。ThenBy和ThenByDescending操作符进行第二次排序。Reverse反转集合中元素的顺序。
Join
GroupJoin
连接操作符用于合并不直接相关的集合。
GroupBy
ToLookUp
组合操作符把数据放在组中。GroupBy操作符组合有公共键的元素,ToLookUp通过创建一个一对一多字典,来组合元素。
Any
All
Contains
如果元素序列满足指定的条件,限定符操作符就返回布尔值。Any确定集合中是否有满足谓词函数的元素;All确定集合中的所有元素是否都满足谓词函数;Contains检查某个元素是否在集合中。
Take
Skip
TakeWhile
SkipWhile
分区操作符返回集合的一个子集。Take必须制定要从集合中提取的元素个数;Skip跳过指定的元素个数,提取其他元素;TakeWhile提取条件为真的元素。
Distinct
Union
Intersect
Except
Distinct从集合中删除重复的元素;Union返回出现在其中一个集合中的唯一元素;Intersect返回两个集合中都有的元素;Except返回只出现在一个集合中的元素;Zip把两个集合合并为一个。
First
FirstOrDefault
Last
LastOrDefault
ElementAt
Single
SingleOrDefault
First返回第一个满足条件的元素;FirstOrDefault如果没有找到第一个满足条件的元素,就返回类型的默认值;ElementAt指定了要返回的元素的位置;Single只返回一个满足条件的元素。
Count
Sum
Min
Max
Average
Aggregate
聚合操作符,可计算所有值的总和、所有元素额个数、值最大的元素、值最小的元素、平均值和忽略错误和隐藏等。
ToArray
AsEnumerable
ToList
ToDirectionary
Cast
这些转换操作符将集合转换为数组:IEnumerable、IList、IDictionary等。
Empty
Range
Repeat
这些生成操作符返回一个新集合。使用Empty时集合是空的;Range返回一系列数字;Repeat返回一个始终重复的值。

三. 筛选

实例:

1. 根据查询字符串筛选

(1)筛选字符串:

string[] studentsName = {"deng", "li", "hu", "bob", "zhang"};

// 创建查询表达式,来代表数组中多于2个字母的项
IEnumerable<string> subset = from g in studentsName
                            where g.Length > 2
                            orderby g
                            select g;
// 输出结果
foreach(dtring s in subset) {
    Console.WriteLine("Item: {0}", s);
}

(2)筛选数组:

int[] numbers = {10, 20, 30, 40, 1, 2, 3, 8};

// 只输出大于10且小于40的项
IEnumerable<int> subset = from i numbers 
                          where i > 10 && (i < 40)
                          select i;
// 输出结果
foreach(int i in subset) {
    Console.WriteLine("Item: {0}", i);
}

2. 根据索引筛选

string[] studentsName = {"deng", "li", "hu", "bob", "zhang"};

// 创建查询表达式,来代表数组中多于2个字母且索引为偶数的项
IEnumerable<string> subset = studentsName.Where((r, index) => r.Length > 2 && index % 2 ! = 0);
// 输出结果
foreach(dtring s in subset) {
    Console.WriteLine("Item: {0}", s);
}

3. 根据类型筛选

object[] data = {"one", 2, 3, "four", "five", 6};
// 选出类型为string的项
var query = data.OfType<string>();
// 输出结果
foreach(var s in query) {
    Console.WriteLine(s);
}

4. 符合from字句查询

创建集合数据:

poblic class Product {
    readonly string name;
    public string Name {get {return name;}}

    readonly string price;
    public string Price {get {return price;}}

    public Product(string name, decimal price) {
        this.name = name;
        this.price = price;
    }  

    public static List<Product> GetSampleProducts() {
        return new List<Product> {
            new Product(name: "West", price: 9.99m);
            new Product(name: "Frogs", price: 14.99m);
            new Product(name: "Apple", price: 3.99m);
            new Product(name: "Bananas", price: 10.99m);
        }
    }
    public override string ToString() {
        return string.Format("{0}: {1}", name, price);
    }
}

使用符合from语句查询:

var subset = from Product r in Product.GetSampleProducts()
             from c in r.Price
             where c > 10
             orderby r.Name
             select r;
foreach(Product product in subset) {
    Console.WriteLine(product);
}

5. 排序

沿用第4点创建的数据集合,使用orderby进行排序:

// 对价钱进行升序排序
var subset = from Product r in Product.GetSampleProducts()
             orderby r.Price
             select r;
foreach(Product product in subset) {
    Console.WriteLine(product);
}

6. 分组

要根据一个关键字对查询结果分组,可以使用group子句。

沿用第4点创建的数据集合,使用group进行分组:

var subset = from Product r in Product.GetSampleProducts()
             group r by r.Price into g
             orderby g.Name descending, g.Price
             where g.Price >= 10
             select new {
                gPrice = g.Price,
                gName = g.Name
             };
foreach(Product product in subset) {
    Console.WriteLine(product);
}
本文作者:子匠_Zijor,转载请注明出处:http://www.dengzhr.com/others/backend/csharp/648