Udostępnij za pośrednictwem


Zapytania z jedną tabelą (LINQ to DataSet)

Zapytania zintegrowane z językiem (LINQ) działają na źródłach danych, które implementują IEnumerable<T> interfejs lub IQueryable<T> interfejs. Klasa DataTable nie implementuje ani interfejsu, więc należy wywołać AsEnumerable metodę , jeśli chcesz użyć DataTable metody jako źródła w From klauzuli zapytania LINQ.

Poniższy przykład pobiera wszystkie zamówienia online z tabeli SalesOrderHeader i zwraca identyfikator zamówienia, datę zamówienia i numer zamówienia do konsoli.

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

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

var query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag") == true
    select new
    {
        SalesOrderID = order.Field<int>("SalesOrderID"),
        OrderDate = order.Field<DateTime>("OrderDate"),
        SalesOrderNumber = order.Field<string>("SalesOrderNumber")
    };

foreach (var onlineOrder in query)
{
    Console.WriteLine("Order ID: {0} Order date: {1:d} Order number: {2}",
        onlineOrder.SalesOrderID,
        onlineOrder.OrderDate,
        onlineOrder.SalesOrderNumber);
}
' 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 orders As DataTable = ds.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
    Select New With { _
        .SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
        .OrderDate = order.Field(Of DateTime)("OrderDate"), _
        .SalesOrderNumber = order.Field(Of String)("SalesOrderNumber") _
     }

For Each onlineOrder In query
    Console.Write("Order ID: " & onlineOrder.SalesOrderID)
    Console.Write(" Order date: " & onlineOrder.OrderDate)
    Console.WriteLine(" Order number: " & onlineOrder.SalesOrderNumber)
Next

Zapytanie zmiennej lokalnej jest inicjowane za pomocą wyrażenia zapytania, które działa na jednym lub kilku źródłach informacji, stosując co najmniej jeden operator zapytania z standardowych operatorów zapytań lub, w przypadku LINQ to DataSet, operatory specyficzne dla DataSet klasy. Wyrażenie zapytania w poprzednim przykładzie używa dwóch standardowych operatorów zapytań: Where i Select.

Klauzula Where filtruje sekwencję na podstawie warunku, w tym przypadku OnlineOrderFlag parametr jest ustawiony na truewartość . Operator Select przydziela i zwraca obiekt wyliczalny, który przechwytuje argumenty przekazane do operatora. W tym powyższym przykładzie typ anonimowy jest tworzony z trzema właściwościami: SalesOrderID, OrderDatei SalesOrderNumber. Wartości tych trzech właściwości są ustawiane na wartości SalesOrderIDkolumn , OrderDatei SalesOrderNumber z SalesOrderHeader tabeli.

Następnie pętla foreach wylicza obiekt wyliczalny zwracany przez Select i zwraca wyniki zapytania. Ponieważ zapytanie jest typem Enumerable , który implementuje IEnumerable<T>, ocena zapytania jest odroczona do momentu iteracji zmiennej zapytania przy użyciu foreach pętli. Ocena zapytań odroczonych umożliwia zachowywanie zapytań jako wartości, które można wielokrotnie oceniać, za każdym razem generując potencjalnie różne wyniki.

Metoda Field zapewnia dostęp do wartości kolumn wartości a DataRow i SetField (nie pokazanych w poprzednim przykładzie) ustawia wartości kolumn w obiekcie DataRow. Zarówno metoda, jak Field i SetField metoda obsługują typy wartości dopuszczalnych wartości null, więc nie trzeba jawnie sprawdzać wartości null. Obie metody są również metodami ogólnymi, co oznacza, że nie trzeba rzutować zwracanego typu. Możesz użyć wstępnie istniejącej metody dostępu do kolumny DataRow (na przykład o["OrderDate"]), ale wymaga to rzutowania obiektu zwracanego na odpowiedni typ. Jeśli kolumna jest typem wartości dopuszczanej do wartości null, należy sprawdzić, czy wartość ma wartość null przy użyciu IsNull metody . Aby uzyskać więcej informacji, zobacz Ogólne pola i Metody SetField.

Należy pamiętać, że typ danych określony w parametrze TField ogólnym metody i SetField metody musi być zgodny z typem InvalidCastException wartości bazowej lub zostanie zgłoszony. Określona nazwa kolumny musi być również zgodna z nazwą kolumny w kolumnie lub , która ArgumentException zostanie wyrzuconaDataSet. W obu przypadkach wyjątek jest zgłaszany w wyliczenie danych w czasie wykonywania zapytania.

Zobacz też