Sdílet prostřednictvím


Dotazy s jednou tabulkou (LINQ to DataSet)

Dotazy LINQ (Language-Integrated Query) pracují na zdrojích dat, které implementují IEnumerable<T> rozhraní nebo IQueryable<T> rozhraní. Třída DataTable neimplementuje ani rozhraní, takže je nutné volat metodu AsEnumerable , pokud chcete použít DataTable jako zdroj v From klauzuli LINQ dotazu.

Následující příklad získá všechny online objednávky z tabulky SalesOrderHeader a vypíše ID objednávky, datum objednávky a číslo objednávky do konzoly.

// 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

Dotaz místní proměnné se inicializuje pomocí výrazu dotazu, který pracuje s jedním nebo více zdroji informací použitím jednoho nebo více operátorů dotazu ze standardních operátorů dotazu nebo v případě LINQ to DataSet operátory specifické pro danou DataSet třídu. Výraz dotazu v předchozím příkladu používá dva standardní operátory dotazu: Where a Select.

Klauzule Where filtruje sekvenci na základě podmínky, v tomto případě, že je nastavena OnlineOrderFlag na true. Operátor Select přidělí a vrátí výčtový objekt, který zachycuje argumenty předané operátoru. V tomto příkladu výše se vytvoří anonymní typ se třemi vlastnostmi: SalesOrderID, OrderDatea SalesOrderNumber. Hodnoty těchto tří vlastností jsou nastaveny na hodnoty SalesOrderID, OrderDatea SalesOrderNumber sloupce z SalesOrderHeader tabulky.

Smyčka foreach pak vytvoří výčet výčtového objektu vráceného Select a vrátí výsledky dotazu. Vzhledem k tomu, že dotaz je Enumerable typ, který implementuje IEnumerable<T>, vyhodnocení dotazu je odloženo, dokud proměnná dotazu nebude iterated přes smyčku foreach . Odložené vyhodnocení dotazu umožňuje, aby se dotazy uchovávaly jako hodnoty, které je možné vyhodnotit vícekrát, při každém potenciálně odlišném výsledku.

Metoda Field poskytuje přístup k hodnotám sloupce a DataRow ( SetField není zobrazeno v předchozím příkladu) nastaví hodnoty sloupců v objektu DataRow. Metoda i SetField metoda zpracovávají typy hodnot s možnou Field hodnotou null, takže nemusíte explicitně kontrolovat hodnoty null. Obě metody jsou obecné metody, což také znamená, že nemusíte přetypovat návratový typ. Můžete použít předpřistupující objekt DataRow sloupce (například o["OrderDate"]), ale to by vyžadovalo přetypování návratového objektu na příslušný typ. Pokud je sloupec typu hodnoty null, musíte pomocí metody zkontrolovat, zda je hodnota null IsNull . Další informace naleznete v tématu Obecné pole a SetField Metody.

Všimněte si, že datový typ zadaný v obecném parametru TField metody a SetField metoda musí odpovídat typu podkladové hodnoty nebo InvalidCastException bude vyvolán. Zadaný název sloupce se také musí shodovat s názvem sloupce v daném DataSet sloupci nebo ArgumentException bude vyvolán. V obou případech je při spuštění dotazu vyvolán výčt dat za běhu.

Viz také