基于方法的查询语法示例:分区 (LINQ)

本主题中的示例演示如何使用 SkipSkipWhileTakeTakeWhile 方法以便使用查询表达式语法来查询 DataSet

这些示例中使用的 FillDataSet 方法在将数据加载到数据集中中指定。

本主题中的示例使用 AdventureWorks 示例数据库中的 Contact、Address、Product、SalesOrderHeader 和 SalesOrderDetail 表。

本主题中的示例使用下面的 using/Imports 语句:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;
Option Explicit On

Imports System.Linq
Imports System.Linq.Expressions
Imports System.Collections.Generic
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.Common
Imports System.Globalization

有关详细信息,请参阅如何:在 Visual Studio 中创建 LINQ to DataSet 项目

跳过

示例

此示例使用 Skip 方法获取 Contact 表中除前五个联系人以外的所有联系人。

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable contacts = ds.Tables["Contact"];

IEnumerable<DataRow> allButFirst5Contacts = contacts.AsEnumerable().Skip(5);

Console.WriteLine("All but first 5 contacts:");
foreach (DataRow contact in allButFirst5Contacts)
{
    Console.WriteLine("FirstName = {0} \tLastname = {1}",
        contact.Field<string>("FirstName"),
        contact.Field<string>("Lastname"));
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim contacts As DataTable = ds.Tables("Contact")

Dim allButFirst5Contacts = contacts.AsEnumerable().Skip(5)

Console.WriteLine("All but first 5 contacts:")

For Each contact In allButFirst5Contacts
    Console.Write("FirstName = {0} ", contact.Field(Of String)("FirstName"))
    Console.WriteLine(vbTab & " LastName = " & contact.Field(Of String)("LastName"))
Next

示例

此示例使用 Skip 方法获取 Seattle 中除前两个地址以外的所有地址。

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable addresses = ds.Tables["Address"];
DataTable orders = ds.Tables["SalesOrderHeader"];

var query = (
    from address in addresses.AsEnumerable()
    from order in orders.AsEnumerable()
    where address.Field<int>("AddressID") == order.Field<int>("BillToAddressID")
         && address.Field<string>("City") == "Seattle"
    select new
    {
        City = address.Field<string>("City"),
        OrderID = order.Field<int>("SalesOrderID"),
        OrderDate = order.Field<DateTime>("OrderDate")
    }).Skip(2);

Console.WriteLine("All but first 2 orders in Seattle:");
foreach (var order in query)
{
    Console.WriteLine("City: {0} Order ID: {1} Total Due: {2:d}",
        order.City, order.OrderID, order.OrderDate);
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim addresses As DataTable = ds.Tables("Address")
Dim orders As DataTable = ds.Tables("SalesOrderHeader")

Dim query = ( _
    From address In addresses.AsEnumerable() _
    From order In orders.AsEnumerable() _
    Where (address.Field(Of Integer)("AddressID") = _
           order.Field(Of Integer)("BillToAddressID")) _
         And address.Field(Of String)("City") = "Seattle" _
    Select New With _
       { _
           .City = address.Field(Of String)("City"), _
           .OrderID = order.Field(Of Integer)("SalesOrderID"), _
           .OrderDate = order.Field(Of DateTime)("OrderDate") _
       }).Skip(2)

Console.WriteLine("All but first 2 orders in Seattle:")
For Each addOrder In query
    Console.Write("City: " & addOrder.City)
    Console.Write(" Order ID: " & addOrder.OrderID)
    Console.WriteLine(" Order date: " & addOrder.OrderDate)
Next

SkipWhile

示例

此示例使用 OrderBySkipWhile 方法返回 Product 表中定价大于 300.00 的产品。

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable products = ds.Tables["Product"];

IEnumerable<DataRow> skipWhilePriceLessThan300 =
    products.AsEnumerable()
        .OrderBy(listprice => listprice.Field<decimal>("ListPrice"))
        .SkipWhile(product => product.Field<decimal>("ListPrice") < 300.00M);

Console.WriteLine("Skip while ListPrice is less than 300.00:");
foreach (DataRow product in skipWhilePriceLessThan300)
{
    Console.WriteLine(product.Field<decimal>("ListPrice"));
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")
Dim skipWhilePriceLessThan300 As IEnumerable(Of DataRow) = _
    products.AsEnumerable() _
        .OrderBy(Function(listprice) listprice.Field(Of Decimal)("ListPrice")) _
        .SkipWhile(Function(product) product.Field(Of Decimal)("ListPrice") < 300D)

Console.WriteLine("First ListPrice less than 300.00:")
For Each product As DataRow In skipWhilePriceLessThan300
    Console.WriteLine(product.Field(Of Decimal)("ListPrice"))
Next

Take

示例

此示例使用 Take 方法只获取 Contact 表中的前五个联系人。

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable contacts = ds.Tables["Contact"];

IEnumerable<DataRow> first5Contacts = contacts.AsEnumerable().Take(5);

Console.WriteLine("First 5 contacts:");
foreach (DataRow contact in first5Contacts)
{
    Console.WriteLine("Title = {0} \t FirstName = {1} \t Lastname = {2}",
        contact.Field<string>("Title"),
        contact.Field<string>("FirstName"),
        contact.Field<string>("Lastname"));
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim contacts As DataTable = ds.Tables("Contact")

Dim first5Contacts = contacts.AsEnumerable().Take(5)

Console.WriteLine("First 5 contacts:")
For Each contact In first5Contacts
    Console.Write("Title = " & contact.Field(Of String)("Title"))
    Console.Write(vbTab & "FirstName = " & contact.Field(Of String)("FirstName"))
    Console.WriteLine(vbTab & "LastName = " & contact.Field(Of String)("LastName"))
Next

示例

此示例使用 Take 方法获取 Seattle 中的前三个地址。

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable addresses = ds.Tables["Address"];
DataTable orders = ds.Tables["SalesOrderHeader"];

var query = (
    from address in addresses.AsEnumerable()
    from order in orders.AsEnumerable()
    where address.Field<int>("AddressID") == order.Field<int>("BillToAddressID")
         && address.Field<string>("City") == "Seattle"
    select new
    {
        City = address.Field<string>("City"),
        OrderID = order.Field<int>("SalesOrderID"),
        OrderDate = order.Field<DateTime>("OrderDate")
    }).Take(3);

Console.WriteLine("First 3 orders in Seattle:");
foreach (var order in query)
{
    Console.WriteLine("City: {0} Order ID: {1} Total Due: {2:d}",
        order.City, order.OrderID, order.OrderDate);
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim addresses As DataTable = ds.Tables("Address")
Dim orders As DataTable = ds.Tables("SalesOrderHeader")

Dim query = ( _
    From address In addresses.AsEnumerable() _
    From order In orders.AsEnumerable() _
    Where (address.Field(Of Integer)("AddressID") = _
        order.Field(Of Integer)("BillToAddressID")) _
         And address.Field(Of String)("City") = "Seattle" _
    Select New With _
    { _
        .City = address.Field(Of String)("City"), _
        .OrderID = order.Field(Of Integer)("SalesOrderID"), _
        .OrderDate = order.Field(Of DateTime)("OrderDate") _
    }).Take(3)

Console.WriteLine("First 3 orders in Seattle:")
For Each order In query
    Console.Write("City: " & order.City)
    Console.Write(" Order ID: " & order.OrderID)
    Console.WriteLine(" Order date: " & order.OrderDate)
Next

TakeWhile

示例

此示例使用 OrderByTakeWhile 返回 Product 表中定价小于 300.00 的产品。

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable products = ds.Tables["Product"];

IEnumerable<DataRow> takeWhileListPriceLessThan300 =
    products.AsEnumerable()
        .OrderBy(listprice => listprice.Field<decimal>("ListPrice"))
        .TakeWhile(product => product.Field<decimal>("ListPrice") < 300.00M);

Console.WriteLine("First ListPrice less than 300:");
foreach (DataRow product in takeWhileListPriceLessThan300)
{
    Console.WriteLine(product.Field<decimal>("ListPrice"));
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim takeWhileListPriceLessThan300 As IEnumerable(Of DataRow) = _
    products.AsEnumerable() _
        .OrderBy(Function(listprice) listprice.Field(Of Decimal)("ListPrice")) _
        .TakeWhile(Function(product) product.Field(Of Decimal)("ListPrice") < 300D)

Console.WriteLine("First ListPrice less than 300.00:")
For Each product As DataRow In takeWhileListPriceLessThan300
    Console.WriteLine(product.Field(Of Decimal)("ListPrice"))
Next

请参阅