Универсальные методы Field и SetField (LINQ to DataSet)
Обновлен: November 2007
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.