Bagikan melalui


Bidang Generik dan Metode SetField (LINQ ke Himpunan Data)

LINQ ke DataSet menyediakan metode ekstensi ke kelas DataRow untuk mengakses nilai kolom: metode Field dan metode SetField. Metode ini memberikan akses yang lebih mudah ke nilai kolom untuk pengembang, terutama mengenai nilai nol. DataSet menggunakan DBNull.Value untuk mewakili nilai null, sedangkan LINQ menggunakan jenis Nullable dan Nullable<T>. Menggunakan pengakses kolom yang sudah ada sebelumnya mengharuskan DataRow Anda untuk mentransmisikan objek yang dikembalikan ke jenis yang sesuai. Jika bidang tertentu dalam DataRow bisa null, Anda harus secara eksplisit memeriksa nilai null karena mengembalikan DBNull.Value dan secara implisit mentransmisikannya ke jenis lain menampilkan InvalidCastException. Dalam contoh berikut ini, jika DataRow.IsNull metode tidak digunakan untuk memeriksa nilai null, pengecualian akan ditampilkan jika pengindeks mengembalikan dan mencoba mentransmisikannya DBNull.Value ke 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

Metode ini Field menyediakan akses ke nilai DataRow kolom dan SetField mengatur nilai kolom dalam DataRow. Metode Field dan metode SetField menangani jenis nilai yang bisa diubah ke null, jadi Anda tidak perlu secara eksplisit memeriksa nilai null seperti pada contoh sebelumnya. Kedua metode ini adalah metode generik, juga, jadi Anda tidak perlu melemparkan jenis pengembalian.

Contoh berikut ini menggunakan metode 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

Perhatikan bahwa jenis data yang ditentukan dalam parameter generik T dari metode Field dan SetField metode harus cocok dengan jenis nilai yang mendasar. Jika tidak, pengecualianInvalidCastException akan ditampilkan. Nama kolom yang ditentukan juga harus cocok dengan nama kolom di DataSet atau ArgumentException yang akan ditampilkan. Dalam kedua kasus, pengecualian ditampilkan pada waktu berjalan selama pencacahan data saat kueri dijalankan.

Metode itu SetField sendiri tidak melakukan konversi jenis apa pun. Namun, ini tidak berarti bahwa konversi tipe tidak akan terjadi. Metode ini SetField mengekspos perilaku DataRow ADO.NET kelas. Konversi jenis bisa dilakukan oleh objek DataRow dan nilai yang dikonversi kemudian akan disimpan ke objek DataRow.

Lihat juga