Condividi tramite


query Single-Table (LINQ to DataSet)

Language-Integrated query LINQ (Query) funzionano su origini dati che implementano l'interfaccia IEnumerable<T> o l'interfaccia IQueryable<T> . La DataTable classe non implementa alcuna interfaccia, pertanto è necessario chiamare il AsEnumerable metodo se si vuole usare DataTable come origine nella From clausola di una query LINQ.

L'esempio seguente ottiene tutti gli ordini online dalla tabella SalesOrderHeader e restituisce l'ID ordine, la data dell'ordine e il numero di ordine nella console.

// 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: {onlineOrder.SalesOrderID} Order date: {onlineOrder.OrderDate:d} Order number: {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

La variabile locale query viene inizializzata con un'espressione di query, che opera su una o più origini di informazioni applicando uno o più operatori di query dagli operatori di query standard o, nel caso di LINQ a DataSet, operatori specifici della classe DataSet. L'espressione di query nell'esempio precedente usa due degli operatori di query standard: Where e Select.

La Where clausola filtra la sequenza in base a una condizione, in questo caso l'oggetto OnlineOrderFlag è impostato su true. L'operatore Select alloca e restituisce un oggetto enumerabile che acquisisce gli argomenti passati all'operatore . In questo esempio precedente viene creato un tipo anonimo con tre proprietà: SalesOrderID, OrderDatee SalesOrderNumber. I valori di queste tre proprietà vengono impostati sui valori delle SalesOrderIDcolonne , OrderDatee SalesOrderNumber della SalesOrderHeader tabella.

Il foreach ciclo enumera quindi l'oggetto enumerabile restituito da Select e restituisce i risultati della query. Poiché la query è un tipo di Enumerable, che implementa IEnumerable<T>, la valutazione della query è posticipata fino a quando la variabile della query non viene iterata tramite il ciclo foreach. La valutazione posticipata delle query consente di mantenere le query come valori che possono essere valutati più volte, ogni volta che producono risultati potenzialmente diversi.

Il Field metodo fornisce l'accesso ai valori di colonna di un DataRow oggetto e , SetField non illustrato nell'esempio precedente, imposta i valori di colonna in un oggetto DataRow. Sia il metodo Field che il metodo SetField gestiscono i tipi valore nullable, pertanto non è necessario controllare in modo esplicito la presenza di valori null. Entrambi i metodi sono metodi generici, quindi non è necessario eseguire il cast del tipo restituito. È possibile utilizzare il modulo di accesso alla colonna preesistente in DataRow (ad esempio, o["OrderDate"]), ma ciò richiederebbe di effettuare il casting dell'oggetto restituito al tipo appropriato. Se la colonna è un tipo di valore nullable, è necessario verificare se il valore è Null usando il IsNull metodo . Per altre informazioni, consultare Generic Field and SetField Methods.

Si noti che il tipo di dato specificato nel parametro generico T del metodo Field e del metodo SetField deve corrispondere al tipo del valore sottostante, altrimenti verrà generata un'eccezione InvalidCastException. Il nome della colonna specificato deve corrispondere anche al nome di una colonna in DataSet o verrà generata un'eccezione ArgumentException . In entrambi i casi, l'eccezione viene generata durante l'enumerazione dei dati di runtime quando viene eseguita la query.

Vedere anche