Megosztás a következőn keresztül:


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ános SortableBindingListleké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 PropertyDescriptorPropertyType . 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ó DataBindingListfelső 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 RemoveItema () 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:

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, és varbinarytimestamp az adatbázistípusok bájttömbre lesznek leképezve. Mivel ToString() 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.

Lásd még