LINQ(Language-Integrated Query)是.NET3.5引入的一种统一查询框架,它允许开发者使用统一的语法来从多种数据源中检索数据,如关系数据库、XML、普通对象等。随着时间的推移,新的LINQ提供者也被开发出来,以支持更多类型的数据源。
LINQ toDataSets是.NET3.5自带的LINQ提供者之一。尽管ADO.NET提供了方法和属性来操作数据,但LINQ to DataSets提供了一种更简单、灵活的选项,其语言语法类似于标准SQL,用于查询和过滤DataTable对象中的数据。下面是一个使用LINQ查询DataTable的示例:
C#
DataTable dt = CustomerDataHelper.GetCustomers();
var nycCustomer =
from dr in dt.AsEnumerable()
where (dr.Field<string>("City") == "New York") && (dr.Field<int>("CustomerID") > 100)
select new{
CustID = dr.Field<int>("CustomerID"),
CustName = dr.Field<string>("CustomerName")
};
foreach (var c in nycCustomer)
{
Console.WriteLine(String.Format("{0} - {1}", c.CustID, c.CustName));
}
从上述代码中可以看出,访问DataRow中的个别列时,使用了Field<>(),这是DataRow类的一个泛型扩展方法。Field方法作为DataRow列的包装器,提供了对底层列值的类型安全访问(记住,LINQ的一个优势就是类型安全的查询),并且它还提供了一些其他的好处。
LINQ也可以在类型化的DataTable实例上使用。在这种情况下,不需要使用Field扩展方法来访问列,因为类型化的DataTable本身会处理列的类型安全性。
当然,同样的查询也可以使用标准查询操作符(方法调用语法)来编写。例如,以下全部方法调用语法与上述类似SQL的语法等效,并产生相同的结果。实际上,在编译期间,类似SQL的语法会被转换为标准查询操作符语法。
C#
nycCustomer = dt.AsEnumerable()
.Where(dr => dr.Field<string>("City") == "New York")
.Select(dr => new { CustID = dr.Field<int>("CustomerID"), CustName = dr.Field<string>("CustomerName") });