Udostępnij za pośrednictwem


Ogólne metody Field i SetField (LINQ to DataSet)

LinQ to DataSet udostępnia metody rozszerzenia dla klasy służące do uzyskiwania dostępu do DataRow wartości kolumn: Field metody i SetField metody. Te metody zapewniają łatwiejszy dostęp do wartości kolumn dla deweloperów, zwłaszcza w przypadku wartości null. Metody DataSet używane DBNull.Value do reprezentowania wartości null, podczas gdy LINQ używa Nullable typów i Nullable<T> . Użycie wstępnie istniejącej metody dostępu do kolumny DataRow wymaga rzutowania obiektu zwracanego na odpowiedni typ. Jeśli określone pole w obiekcie DataRow może mieć wartość null, musisz jawnie sprawdzić wartość null, ponieważ zwracanie i niejawnie rzutowanie DBNull.Value go do innego typu zgłasza błąd InvalidCastException. W poniższym przykładzie, jeśli DataRow.IsNull metoda nie została użyta do sprawdzenia wartości null, wyjątek zostanie zgłoszony, jeśli indeksator zwrócił DBNull.Value i próbował rzutować go na Stringwartość .

// 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 zapewnia dostęp do wartości kolumn elementu DataRow i SetField ustawia wartości kolumn w obiekcie DataRow. Zarówno metoda, jak Field i SetField metoda obsługują typy wartości dopuszczalnych wartości null, więc nie trzeba jawnie sprawdzać wartości null, jak w poprzednim przykładzie. Obie metody są również metodami ogólnymi, więc nie trzeba rzutować zwracanego typu.

W poniższym przykładzie użyto Field metody .

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

Należy pamiętać, że typ danych określony w parametrze TField ogólnym metody i SetField metoda musi być zgodna z typem wartości bazowej. W przeciwnym razie zostanie InvalidCastException zgłoszony wyjątek. Określona nazwa kolumny musi być również zgodna z nazwą kolumny w elemecie ArgumentException , lub zostanie wyrzuconaDataSet. W obu przypadkach wyjątek jest zgłaszany w czasie wykonywania podczas wyliczania danych podczas wykonywania zapytania.

Sama SetField metoda nie wykonuje żadnych konwersji typów. Nie oznacza to jednak, że konwersja typu nie zostanie wykonana. Metoda SetField uwidacznia zachowanie DataRow ADO.NET klasy. Konwersja typu może być wykonywana przez DataRow obiekt, a przekonwertowana wartość zostanie następnie zapisana w DataRow obiekcie.

Zobacz też