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
, OrderDate
a SalesOrderNumber
. Hodnoty těchto tří vlastností jsou nastaveny na hodnoty SalesOrderID
, OrderDate
a 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 T
Field 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.