65.9K
CodeProject 正在变化。 阅读更多。
Home

LINQ to DataSets

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2013 年 10 月 11 日

CPOL

2分钟阅读

viewsIcon

23664

简介LINQ 是 C# 3.0 中的新特性之一,作为 .NET 3.5 的一部分引入。 如你所知,LINQ 是一个统一的查询

引言

LINQ 是 C# 3.0 中的新特性之一,作为 .NET 3.5 的一部分引入。 如你所知,LINQ 是一个统一的查询框架,用于从各种数据源(如关系数据库、XML、普通对象)检索数据,并且正在为其他类型的数据源编写新的 LINQ 提供程序。

LINQ to DataSets

.NET 3.5 随附了许多开箱即用的 LINQ 提供程序,其中之一就是 LINQ to DataSets。 尽管 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")});

由于 ADO.NET(以及 DataTable)是在 LINQ 之前很久引入 .NET 的,因此对 DataTable 的 LINQ 支持是通过新的程序集 System.Data.DataSetExtensions.dll 提供的。 因此,请记住在编写 LINQ to DataSets 代码时添加对该程序集的引用。

链接

© . All rights reserved.