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

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

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

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

В следующем примере используется метод 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

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

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

См. также