Allmänna fält- och SetField-metoder (LINQ till DataSet)
LINQ till DataSet tillhandahåller tilläggsmetoder till DataRow klassen för åtkomst till kolumnvärden: Field metoden och SetField metoden. Dessa metoder ger enklare åtkomst till kolumnvärden för utvecklare, särskilt när det gäller null-värden. Används DataSet DBNull.Value för att representera null-värden, medan LINQ använder typerna Nullable och Nullable<T> . Om du använder den befintliga kolumnåtkomstorn i DataRow måste du omvandla returobjektet till lämplig typ. Om ett visst fält i ett DataRow kan vara null måste du uttryckligen söka efter ett null-värde eftersom returnera och DBNull.Value implicit konvertera det till en annan typ genererar en InvalidCastException. I följande exempel, om DataRow.IsNull metoden inte användes för att söka efter ett null-värde, utlöses ett undantag om indexeraren returnerade DBNull.Value och försökte omvandla den till en 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
Metoden Field ger åtkomst till kolumnvärdena för en DataRow och SetField anger kolumnvärdena i en DataRow. Field Både metoden och SetField metoden hanterar nullbara värdetyper, så du behöver inte uttryckligen söka efter nullvärden som i föregående exempel. Båda metoderna är också generiska metoder, så du behöver inte kasta returtypen.
I följande exempel används Field metoden.
// 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
Observera att datatypen som anges i den generiska parametern T
för Field metoden och SetField metoden måste matcha typen av underliggande värde. Annars utlöses ett InvalidCastException undantag. Det angivna kolumnnamnet måste också matcha namnet på en kolumn i DataSet, eller så genereras ett ArgumentException . I båda fallen genereras undantaget vid körning under uppräkningen av data när frågan körs.
Själva SetField metoden utför inga typkonverteringar. Detta innebär dock inte att en typkonvertering inte kommer att ske. Metoden SetField exponerar klassens ADO.NET beteende DataRow . En typkonvertering kan utföras av DataRow objektet och det konverterade värdet sparas sedan i DataRow objektet.