Obecné pole a metody SetField (LINQ to DataSet)

LINQ to DataSet poskytuje rozšiřující metody třídy DataRow pro přístup k hodnotám sloupců: metodu Field a metodu SetField . Tyto metody poskytují snadnější přístup k hodnotám sloupců pro vývojáře, zejména pokud jde o hodnoty null. Používá DataSetDBNull.Value se k reprezentaci hodnot null, zatímco LINQ používá a Nullable<T>Nullable typy. Použití před existujícího přístupového objektu DataRow sloupce vyžaduje přetypování návratového objektu na příslušný typ. Pokud může mít určité pole hodnotu DataRow null, musíte explicitně zkontrolovat hodnotu null, protože vrácení DBNull.Value a implicitně přetypování na jiný typ vyvolá InvalidCastExceptionvýjimku . V následujícím příkladu DataRow.IsNull , pokud metoda nebyla použita ke kontrole hodnoty null, by byla vyvolán výjimka, pokud indexer vrátil DBNull.Value a pokusil se jej přetypovat na Stringhodnotu .

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

Metoda Field poskytuje přístup k hodnotám DataRow sloupce a SetField nastaví hodnoty sloupce v objektu DataRow. Metoda Field i SetField metoda zpracovávají typy hodnot s možnou hodnotou null, takže nemusíte explicitně kontrolovat hodnoty null jako v předchozím příkladu. Obě metody jsou obecné metody, takže návratový typ nemusíte přetypovat.

Následující příklad používá metodu Field .

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

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

Samotná SetField metoda neprovádí žádné převody typů. To ale neznamená, že nedojde k převodu typu. Metoda SetField zveřejňuje ADO.NET chování DataRow třídy. Převod typu by mohl provést DataRow objekt a převedená hodnota by se pak uložila do objektu DataRow .

Viz také