Универсальные методы Field и SetField (LINQ to DataSet)

LINQ to DataSet реализует методы расширений класса DataRow для доступа к значениям столбцов: Field и SetField. Эти методы предоставляют разработчикам более простой доступ к значениям столбцов, особенно в отношении значений NULL. Объект DataSet использует для представления значений NULL класс Value, тогда как LINQ использует поддержку платформой .NET Framework 2.0 типов, допускающих значения NULL. Использование существующего метода доступа столбцов в объекте DataRow требует приведения возвращаемого объекта к нужному типу. Если определенное поле в объекте DataRow может иметь значение NULL, необходимо явно проверить наличие значения NULL, поскольку при возвращении объекта Value и неявном приведении его к другому типу возникает исключение InvalidCastException. В следующем примере, если метод IsNull не использовался для проверки на значение NULL, возникнет исключение, если индексатор возвращает объект Value и пытается привести его к типу String.

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

Метод Field предоставляет доступ к значениям столбцов в DataRow, а метод SetField устанавливает значения столбцов в DataRow. Оба метода, Field и SetField, обрабатывают типы, допускающие значения NULL, поэтому нет необходимости явно проводить проверку на значения NULL, как в предыдущем примере. Оба метода являются универсальными, поэтому приводить возвращенные данные к определенному типу не нужно.

В следующем примере используется метод Field.

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

Обратите внимание, что тип данных, определяемый в универсальном параметре T метода Field и метода SetField, должен совпадать с типом базового значения. В противном случае возникнет исключение InvalidCastException. Указанное имя столбца также должно совпадать с именем столбца в DataSet, в противном случае возникнет исключение ArgumentException. В обоих случаях исключения возникают во время выполнения при перечислении данных в ходе выполнения запроса.

Метод SetField сам по себе не выполняет преобразования типов. Однако это не означает, что преобразование типов не происходит. Метод SetField реализует поведение ADO.NET 2.0 класса DataRow. Преобразование типов может быть выполнено объектом DataRow, а преобразованное значение затем будет сохранено в объекте DataRow.

См. также

Ссылки

DataRowExtensions