Generische Field- und SetField-Methoden (LINQ to DataSet)

LINQ to DataSet stellt der DataRow-Klasse Erweiterungsmethoden für den Zugriff auf Spaltenwerte zur Verfügung, nämlich die Methoden Field und SetField. Diese Methoden erleichtern Entwicklern den Zugriff auf Spaltenwerte, besonders hinsichtlich der NULL-Werte. DataSet verwendet DBNull.Value, um NULL-Werte darzustellen, während LINQ die Typen Nullable und Nullable<T> verwendet. Für die Nutzung der schon zuvor vorhandenen Spaltenzugriffsmethode in DataRow müssen Sie das Rückgabeobjekt in den entsprechenden Typ umwandeln. Falls ein bestimmtes DataRow-Feld NULL sein kann, müssen Sie explizit auf einen NULL-Wert prüfen, da bei der Rückgabe von DBNull.Value und der impliziten Umwandlung in einen anderen Typ eine InvalidCastException ausgelöst wird. Wenn im folgenden Beispiel keine Prüfung auf NULL-Werte mittels der DataRow.IsNull-Methode stattfinden würde und der Indexer DBNull.Value zurückgeben und versuchen würde, den Rückgabewert in den Typ String umzuwandeln, würde eine Ausnahme ausgelöst werden.

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

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

var query =
    from product in products.AsEnumerable()
    where !product.IsNull("Color") &&
        (string)product["Color"] == "Red"
    select new
    {
        Name = product["Name"],
        ProductNumber = product["ProductNumber"],
        ListPrice = product["ListPrice"]
    };

foreach (var product in query)
{
    Console.WriteLine("Name: {0}", product.Name);
    Console.WriteLine("Product number: {0}", product.ProductNumber);
    Console.WriteLine("List price: ${0}", product.ListPrice);
    Console.WriteLine("");
}
' 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 query = _
    From product In products.AsEnumerable() _
    Where product!Color IsNot DBNull.Value AndAlso product!Color = "Red" _
    Select New With _
       { _
           .Name = product!Name, _
           .ProductNumber = product!ProductNumber, _
           .ListPrice = product!ListPrice _
       }

For Each product In query
    Console.WriteLine("Name: " & product.Name)
    Console.WriteLine("Product number: " & product.ProductNumber)
    Console.WriteLine("List price: $" & product.ListPrice & vbNewLine)
Next

Die Field-Methode bietet Zugriff auf die Spaltenwerte einer DataRow, und die SetField-Methode gibt Spaltenwerte in einer DataRow an. Sowohl die Field-Methode als auch die SetField-Methode handhaben Typen, die NULL zulassen, sodass die explizite Prüfung auf NULL-Werte (wie im Beispiel oben) entfallen kann. Beide Methoden sind darüber hinaus generische Methoden. Der Rückgabetyp muss also nicht konvertiert werden.

Im folgenden Beispiel wird die Field-Methode verwendet:

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

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

var query =
    from product in products.AsEnumerable()
    where product.Field<string>("Color") == "Red"
    select new
    {
        Name = product.Field<string>("Name"),
        ProductNumber = product.Field<string>("ProductNumber"),
        ListPrice = product.Field<Decimal>("ListPrice")
    };

foreach (var product in query)
{
    Console.WriteLine("Name: {0}", product.Name);
    Console.WriteLine("Product number: {0}", product.ProductNumber);
    Console.WriteLine("List price: ${0}", product.ListPrice);
    Console.WriteLine("");
}
' 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 query = _
    From product In products.AsEnumerable() _
    Where product.Field(Of String)("Color") = "Red" _
    Select New With _
       { _
           .Name = product.Field(Of String)("Name"), _
           .ProductNumber = product.Field(Of String)("ProductNumber"), _
           .ListPrice = product.Field(Of Decimal)("ListPrice") _
       }

For Each product In query
    Console.WriteLine("Name: " & product.Name)
    Console.WriteLine("Product number: " & product.ProductNumber)
    Console.WriteLine("List price: $ " & product.ListPrice & vbNewLine)
Next

Beachten Sie, dass der im generischen Parameter T der Methoden Field und SetField angegebene Datentyp mit dem Typ des zugrunde liegenden Werts übereinstimmen muss. Anderenfalls wird eine InvalidCastException ausgelöst. Der angegebene Spaltenname muss außerdem mit dem Namen einer DataSet-Spalte übereinstimmen. Wenn dies nicht der Fall ist, wird eine ArgumentException ausgelöst. In beiden Fällen wird die Ausnahme bei der Datenenumeration zur Laufzeit ausgelöst, wenn die Abfrage ausgeführt wird.

Die SetField-Methode selbst führt keine Typkonvertierungen aus. Dies bedeutet jedoch nicht, dass keinerlei Typkonvertierung auftritt. Die SetField-Methode macht das ADO.NET-Verhalten der DataRow-Klasse verfügbar. Eine Typkonvertierung kann vom DataRow-Objekt ausgeführt werden, wobei der konvertierte Wert dann im DataRow-Objekt gespeichert wird.

Siehe auch