Labdien,
Jau agrāk minēju, ka nodarbojos ar liela projekta atbalstu un tā pilnveidošanu. Parasti viss lielais sākas ar ko mazu. Pirmsākumā projekts tika veidots ar .NET 1.0 iespējām, pakāpeniski migrēts uz .NET 3.5. Rezultātā mantojumā saņēmu tipizētos DataSet. Pilnveidojot kodu būtu nepareizi turpināt izmantot vecos paņēmienus, ja ir pieejami daudz optimālāki, piemēram datu filtrācija izmantojot LINQ. Bet ir momenti par kuriem uzreiz ir jāpadomā. Apskatīsim maksimāli pietuvinātu realitātei piemēru.
Izveidosim vienkāršu datu modeli. Tabula Invoice ar trim kolonām (invoice_guid, amount, paid_date). Kolona paid_date ir neobligāta, tiek aizpildīta rēķina apmaksas brīdī.
Uzrakstot nelielu kodu aizpildām tabulu ar datiem (piemērā, tikai vien no ierakstiem būs ar aizpildītu apmaksas datumu).
var ds = new TestDataSet();
for (int i = 0; i < 3; i++)
{
TestDataSet.InvoiceRow row = ds.Invoice.NewInvoiceRow();
row.invoice_guid = Guid.NewGuid();
row.amount = i*10;
if (i == 0)
{
row.paid_date = DateTime.Now;
}
ds.Invoice.AddInvoiceRow(row);
}
Lūk, dati mums ir, sākam pildīt noteiktas darbības. Piemēram – sakārtošana. Agrāk varēja uzrakstīt piemēram šādi(atlasam visus datus no tabulas un sakārtojam pēc apmaksas datuma):
ds.Invoice.Select("", "paid_date desc");
Šādi izskatās tā pati darbība izmantojot LINQ
ds.Invoice.OrderByDescending(i => i.paid_date);
Lieta tāda, ja mēs veicam lauka paid_date vērtības iegūšanas izsaukumu un lauka vērtība ir NULL, izpildes laikā tiek izmesta kļūda. Lai kods sāktu korekti strādāt, filtrācijas nosacījumā jāparedz NULL gadījums. Šādi izskatās piemērs, kur tiek ievērots minētais gadījums:
var q = ds.Invoice.OrderByDescending(
i => (i.Ispaid_dateNull() ? null : (DateTime?)i.paid_date));
Problēmu atrisinājām, bet varētu būt labāk. Iespējamais risinājums, papildināt DataSet, lai Invoice ierakstam parādītos jauns lauks, piemēram – paid_dateLinq.
Piemērs:
public partial class TestDataSet
{
public partial class InvoiceRow
{
public DateTime? paid_dateLinq
{
get
{
if (Ispaid_dateNull())
{
return null;
}
return paid_date;
}
}
}
}
Jaunais lauks nodrošinās vērtības atgriešanu, apejot ierobežojumus. Šādi izskatās piemērs, kur tiek ievērots minētais gadījums:
var q = ds.Invoice.OrderByDescending(i => i.paid_dateLinq);
Iespējams ir kāds vel risinājums šai problēmai, par kuru uzreiz neaizdomājos. Labprāt iepazītos ar lasītāju iesūtītiem variantiem. Rakstiet!
Cerams noderēs!
Posted
Mar 05 2009, 10:04 AM
by
andrejs.mamontovs