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

LINQ to DataSet stellt der DataRow-Klasse Erweiterungsmethoden für den Zugriff auf Spaltenwerte zur Verfügung: die Field-Methode und die SetField-Methode. Diese Methoden erleichtern Entwicklern den Zugriff auf Spaltenwerte, besonders hinsichtlich der NULL-Werte. Das DataSet verwendet Value, um NULL-Werte darzustellen, während LINQ auf die Unterstützung für den in .NET Framework 2.0 eingeführten Typ zurückgreift, der NULL-Werte zulässt. Für die Nutzung des schon zuvor vorhandenen Spaltenaccessors in DataRow müssen Sie das Rückgabeobjekt in den entsprechenden Typ konvertieren. Falls ein bestimmtes DataRow-Feld NULL sein kann, müssen Sie explizit auf einen NULL-Wert prüfen, da bei der Rückgabe von 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 IsNull-Methode stattfinden würde und der Indexer Value zurückgeben und versuchen würde, den Rückgabewert in den String-Typ umzuwandeln, würde eine Ausnahme ausgelöst werden.

' 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
// 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("");
}

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 kümmern sich um 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.
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
// 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("");
}

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 2.0-Verhalten der DataRow-Klasse verfügbar. Eine Typkonvertierung könnte vom DataRow-Objekt ausgeführt werden, wobei der konvertierte Wert dann im DataRow-Objekt gespeichert werden würde.

Siehe auch

Referenz

DataRowExtensions