Adatkötés
A LINQ–SQL támogatja a közös vezérlőkhöz, például a rácsvezérlőkhöz való kötést. Az SQL LINQ-jának alapvető mintáit határozza meg az adatrácshoz való kötéshez és a fő részletes kötés kezeléséhez mind a megjelenítés, mind a frissítés tekintetében.
Mögöttes elv
A LINQ-ről SQL-re lefordítja a LINQ-lekérdezéseket az SQL-nek az adatbázison való végrehajtáshoz. Az eredmények erősen be vannak gépelve IEnumerable
. Mivel ezek az objektumok szokásos közös nyelvi futtatókörnyezeti (CLR-) objektumok, az eredmények megjelenítéséhez szokásos objektumadat-kötés használható. A módosítási műveletek (beszúrások, frissítések és törlések) azonban további lépéseket igényelnek.
Művelet
A Windows Forms-vezérlőkhöz való implicit kötés megvalósítása a implementálással IListSourcetörténik. Az adatforrások általános Table<TEntity> (Table<T>
C# vagy Table(Of T)
Visual Basic nyelven) és általánosak DataQuery
lettek frissítve a implementáláshoz IListSource. A felhasználói felület (UI) adatkötési motorjai (Windows Forms és Windows megjelenítési alaprendszer) egyaránt tesztelik, hogy az adatforrás implementálva IListSourcevan-e. Ezért a lekérdezés közvetlen befolyásolásának írása egy vezérlő adatforrására implicit módon meghívja a LINQ-t az SQL-gyűjtemény generálására, ahogyan az alábbi példában is látható:
DataGrid dataGrid1 = new DataGrid();
DataGrid dataGrid2 = new DataGrid();
DataGrid dataGrid3 = new DataGrid();
var custQuery =
from cust in db.Customers
select cust;
dataGrid1.DataSource = custQuery;
dataGrid2.DataSource = custQuery;
dataGrid2.DataMember = "Orders";
BindingSource bs = new BindingSource();
bs.DataSource = custQuery;
dataGrid3.DataSource = bs;
Dim dataGrid1 As New DataGrid()
Dim dataGrid2 As New DataGrid()
Dim dataGrid3 As New DataGrid()
Dim custQuery = _
From cust In db.Customers _
Select cust
dataGrid1.DataSource = custQuery
dataGrid2.DataSource = custQuery
dataGrid2.DataMember = "Orders"
Dim bs = _
New BindingSource()
bs.DataSource = custQuery
dataGrid3.DataSource = bs
Ugyanez történik a Windows megjelenítési alaprendszer esetében is:
ListView listView1 = new ListView();
var custQuery2 =
from cust in db.Customers
select cust;
ListViewItem ItemsSource = new ListViewItem();
ItemsSource = (ListViewItem)custQuery2;
Dim listView1 As New ListView()
Dim custQuery2 = _
From cust In db.Customers _
Select cust
Dim ItemsSource As New ListViewItem
ItemsSource = custQuery2
A gyűjteménygenerációkat az általános Table<TEntity> és az általános GetListDataQuery
a .
IListSource-implementáció
LINQ–SQL-implementálás IListSource két helyen:
Az adatforrás a Table<TEntity>következő: LINQ to SQL tallózik a táblában egy
DataBindingList
olyan gyűjtemény kitöltéséhez, amely a táblán lévő hivatkozást tárolja.Az adatforrás egy IQueryable<T>. Két forgatókönyv létezik:
Ha a LINQ és az SQL megkeresi a mögöttes forrást Table<TEntity> IQueryable<T>, a forrás engedélyezi a kiadást, és a helyzet ugyanaz, mint az első felsoroláspontban.
Ha a LINQ az SQL-nek nem találja az alapul szolgálót Table<TEntity>, a forrás nem engedélyezi a kiadást (például
groupby
). A LINQ to SQL egy általánosSortableBindingList
lekérdezés kitöltéséhez böngészi a lekérdezést, amely egyszerű BindingList<T> , amely implementálja az adott tulajdonsághoz tartozó T entitások rendezési funkcióját.
Specializált gyűjtemények
A dokumentum BindingList<T> korábbi részében ismertetett számos funkció esetében különböző osztályokra specializálódott. Ezek az osztályok általánosak SortableBindingList
és általánosak DataBindingList
. Mindkettő belsőként van deklarálva.
Generic SortableBindingList
Ez az osztály öröklődik, BindingList<T>és az osztály rendezhető verziója BindingList<T>. A rendezés memóriabeli megoldás, és soha nem lép kapcsolatba magával az adatbázissal. BindingList<T> implementálja, IBindingList de alapértelmezés szerint nem támogatja a rendezést. Azonban virtuális BindingList<T> mag metódusokkal implementálIBindingList. Ezeket a metódusokat egyszerűen felülbírálhatja. Általános SortableBindingList
felülbírálások SupportsSortingCore, SortPropertyCoreSortDirectionCoreés ApplySortCore. ApplySortCore
az adott tulajdonsághoz tartozó T-elemek listájának meghívása ApplySort és rendezése.
Kivétel akkor keletkezik, ha a tulajdonság nem T tulajdona.
A rendezés érdekében a LINQ-tól az SQL-hez létrehoz egy általános SortableBindingList.PropertyComparer
osztályt, amely az általánostól IComparer.Compare örököl, és egy alapértelmezett összehasonlítót implementál egy adott T típushoz, egy PropertyDescriptor
, és egy irányhoz. Ez az osztály dinamikusan létrehoz egy Comparer
T-t, ahol T a PropertyDescriptor
PropertyType
. Ezután a rendszer lekéri az alapértelmezett összehasonlítót a statikus általánostól Comparer
. A rendszer az alapértelmezett példányt visszatükrözéssel szerzi be.
A Generic SortableBindingList
a .DataBindingList
Az Generic SortableBindingList
két virtuális módszert kínál az elemek nyomon követésének felfüggesztésére vagy folytatására. Ez a két módszer használható olyan alapfunkciókhoz, mint a rendezés, de az általánoshoz hasonló DataBindingList
felső osztályok implementálják.
Általános DataBindingList
Ez az osztály az általánostól SortableBindingLIst
öröklődik. A Generic DataBindingList
a gyűjtemény kezdeti kitöltéséhez használt általános generikusra Table
IQueryable
hivatkozik. Az Általános DatabindingList
elem hozzáadása/eltávolítása a gyűjteményhez a () és RemoveItem
a () felülírással hozzáadja az elemek nyomon követésétInsertItem
. Emellett implementálja az absztrakt felfüggesztési/folytatáskövetési funkciót is, hogy a nyomon követés feltételes legyen. Ez a funkció általánosan DataBindingList
kihasználja a szülőosztályok nyomkövetési funkciójának polimorfikus használatát.
Kötés entitySetshez
EntitySet
A kötés egy speciális eset, mert EntitySet
már egy olyan gyűjtemény, amely implementálja IBindingLista elemet. A LINQ az SQL-hez rendezési és megszakítási (ICancelAddNew) támogatást biztosít. Az EntitySet
osztály egy belső listát használ az entitások tárolására. Ez a lista egy alacsony szintű gyűjtemény, amely egy általános tömbön, az általános ItemList
osztályon alapul.
Rendezési funkció hozzáadása
A tömbök kínálnak egy rendezési módszert (Array.Sort()
), amelyet egy T LINQ-val Comparer
használhat az SQL-nek a jelen témakörben korábban ismertetett általános SortableBindingList.PropertyComparer
osztály használatával a tulajdonság és a rendezendő irány beolvasásához Comparer
. A rendszer hozzáad egy ApplySort
metódust az általánoshoz ItemList
a funkció meghívásához.
Ezen az EntitySet
oldalon most a rendezési támogatást kell deklarálnia:
SupportsSortingvisszatérési érték.
true
ApplySort hívásokat,
entities.ApplySort()
majdOnListChanged()
.SortDirection a tulajdonságok pedig SortProperty a helyi tagokban tárolt jelenlegi rendezési definíciót teszik elérhetővé.
Ha System.Windows.Forms.BindingSource-t használ, és egy EntitySet<TEntity-t> köt a System.Windows.Forms.BindingSource.DataSource-hoz, meg kell hívnia az EntitySet<TEntityet>. GetNewBindingList a BindingSource.List frissítéséhez.
Ha System.Windows.Forms.BindingSource-t használ, és a BindingSource.DataMember tulajdonságot állítja be, és a BindingSource.DataSource-t olyan osztályra állítja, amelynek a BindingSource.DataMember nevű tulajdonsága az EntitySet<TEntity> függvényt teszi elérhetővé, nem kell meghívnia az EntitySet<TEntityet>. GetNewBindingList a BindingSource.List frissítéséhez, de elveszíti a rendezési képességet.
Gyorsítótárazás
LINQ–SQL-lekérdezések implementálása GetList. Amikor a Windows Forms BindingSource osztály megfelel ennek a felületnek, három alkalommal hívja meg a GetList() függvényt egyetlen kapcsolatra. A probléma megoldásához a LINQ–SQL példányonként egy gyorsítótárat implementál, és mindig ugyanazt a létrehozott gyűjteményt adja vissza.
Érvénytelenítés
IBindingList egy metódust AddNew határoz meg, amelyet a vezérlők használnak új elem létrehozásához egy kötött gyűjteményből. A DataGridView
vezérlő nagyon jól mutatja ezt a funkciót, ha az utolsó látható sor egy csillagot tartalmaz a fejlécében. A csillag azt mutatja, hogy hozzáadhat egy új elemet.
A funkció mellett egy gyűjtemény is implementálható ICancelAddNew. Ez a funkció lehetővé teszi, hogy a vezérlők visszavonják vagy ellenőrizze, hogy az új szerkesztett elem ellenőrzése megtörtént-e.
ICancelAddNew minden LINQ-ban implementálva van az SQL-adatgyűjtőkre (általános SortableBindingList
és általános EntitySet
). Mindkét implementációban a kód a következőképpen teljesít:
Lehetővé teszi az elemek beszúrását és eltávolítását a gyűjteményből.
Nem követi nyomon a módosításokat, amíg a felhasználói felület nem véglegesíti a kiadást.
Mindaddig nem követi nyomon a módosításokat, amíg a kiadást megszakítja (CancelNew).
Lehetővé teszi a kiadás véglegesítése (EndNew) nyomon követését.
Lehetővé teszi, hogy a gyűjtemény megfelelően viselkedjen, ha az új elem nem származik.AddNew
Hibaelhárítás
Ez a szakasz számos olyan elemet hív fel, amelyek segíthetnek a LINQ és az SQL-adatkötési alkalmazások hibaelhárításában.
Tulajdonságokat kell használnia; a csak mezők használata nem elegendő. A Windows Forms megköveteli ezt a használatot.
Alapértelmezés szerint a
image
, ésvarbinary
timestamp
az adatbázistípusok bájttömbre lesznek leképezve. MivelToString()
ebben a forgatókönyvben nem támogatott, ezek az objektumok nem jeleníthetők meg.Az elsődleges kulcsra leképezett osztálytag rendelkezik egy beállítóval, de az SQL-hez tartozó LINQ nem támogatja az objektum identitásának módosítását. Ezért a leképezésben használt elsődleges/egyedi kulcs nem frissíthető az adatbázisban. A rács módosítása kivételt okoz a híváskor SubmitChanges.
Ha egy entitás két külön rácsba van kötve (például egy fő és egy másik részlet), a rendszer nem propagálja a főrács egy
Delete
elemét a részletrácsra.