Delen via


Gegevensbinding

LINQ naar SQL ondersteunt binding met algemene besturingselementen, zoals rasterbesturingselementen. LinQ naar SQL definieert met name de basispatronen voor het binden aan een gegevensraster en het verwerken van hoofddetailbinding, zowel met betrekking tot weergave als bijwerken.

Onderliggend principe

LINQ naar SQL vertaalt LINQ-query's naar SQL voor uitvoering op een database. De resultaten worden sterk getypt IEnumerable. Omdat deze objecten gewone CLR-objecten (Common Language Runtime) zijn, kunnen gewone objectgegevensbinding worden gebruikt om de resultaten weer te geven. Aan de andere kant vereisen wijzigingsbewerkingen (invoegingen, updates en verwijderingen) aanvullende stappen.

Operation

Impliciet verbinden met Besturingselementen voor Windows Forms wordt bereikt door implementatie IListSource. Gegevensbronnen algemeen Table<TEntity> (Table<T> in C# of Table(Of T) in Visual Basic) en algemeen DataQuery zijn bijgewerkt om te implementeren IListSource. Gebruikersinterface (UI) gegevensbindingengines (Windows Forms en Windows Presentation Foundation) testen beide of hun gegevensbron wordt geïmplementeerd IListSource. Daarom wordt het schrijven van een directe invloed van een query naar een gegevensbron van een besturingselement impliciet LINQ aan het genereren van SQL-verzamelingen aanroepen, zoals in het volgende voorbeeld:

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

Hetzelfde gebeurt met Windows Presentation Foundation:

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

Verzamelingsgeneraties worden geïmplementeerd door algemeen Table<TEntity> en algemeen DataQuery in GetList.

IListSource-implementatie

LINQ naar SQL implementeert IListSource op twee locaties:

  • De gegevensbron is een Table<TEntity>: LINQ naar SQL bladert door de tabel om een DataBindingList verzameling te vullen die een verwijzing in de tabel bewaart.

  • De gegevensbron is een IQueryable<T>. Er zijn twee scenario's:

    • Als LINQ naar SQL de onderliggende elementen Table<TEntity> vindt IQueryable<T>, staat de bron editie toe en is de situatie hetzelfde als in het eerste opsommingsteken.

    • Als LINQ naar SQL de onderliggende Table<TEntity>gegevens niet kan vinden, staat de bron bijvoorbeeld geen editie toe . groupby LINQ naar SQL bladert door de query om een algemeen SortableBindingListin te vullen, wat een eenvoudige BindingList<T> functie is waarmee de sorteerfunctie voor T-entiteiten voor een bepaalde eigenschap wordt geïmplementeerd.

Gespecialiseerde verzamelingen

Voor veel functies die eerder in dit document zijn beschreven, BindingList<T> is gespecialiseerd in een aantal verschillende klassen. Deze klassen zijn algemeen SortableBindingList en algemeen DataBindingList. Beide worden gedeclareerd als intern.

Generic SortableBindingList

Deze klasse neemt over van BindingList<T>en is een sorteerbare versie van BindingList<T>. Sorteren is een oplossing in het geheugen en neemt nooit contact op met de database zelf. BindingList<T> implementeert IBindingList , maar biedt geen ondersteuning voor sorteren standaard. BindingList<T> Implementeert IBindingList echter met virtuele kernmethoden. U kunt deze methoden eenvoudig overschrijven. Algemene SortableBindingList onderdrukkingenSupportsSortingCore, SortPropertyCore, en SortDirectionCoreApplySortCore. ApplySortCore wordt aangeroepen door ApplySort en sorteert de lijst met T-items voor een bepaalde eigenschap.

Er wordt een uitzondering gegenereerd als de eigenschap niet tot T behoort.

Als u wilt sorteren, maakt LINQ naar SQL een algemene SortableBindingList.PropertyComparer klasse die overgaat van algemeen IComparer.Compare en een standaard comparer implementeert voor een bepaald type T, een PropertyDescriptoren een richting. Deze klasse maakt dynamisch een Comparer T waar T de is van de PropertyType PropertyDescriptor. Vervolgens wordt de standaard comparer opgehaald uit de statische algemene Comparer. Er wordt een standaardexemplaren verkregen met behulp van weerspiegeling.

Algemeen SortableBindingList is ook de basisklasse voor DataBindingList. Generic SortableBindingList biedt twee virtuele methoden voor het onderbreken of hervatten van het bijhouden van items voor het toevoegen/verwijderen van items. Deze twee methoden kunnen worden gebruikt voor basisfuncties zoals sorteren, maar worden echt geïmplementeerd door hogere klassen, zoals algemeen DataBindingList.

Generic DataBindingList

Deze klasse neemt over van algemeen SortableBindingLIst. Algemeen DataBindingList houdt een verwijzing over de onderliggende algemene Table van het algemene IQueryable dat wordt gebruikt voor de initiële vulling van de verzameling. Algemeen DatabindingList voegt tracering toe voor item toevoegen/verwijderen aan de verzameling door () en RemoveItem() te overschrijvenInsertItem. Ook wordt de abstracte functie voor het onderbreken/hervatten van het bijhouden geïmplementeerd om het bijhouden voorwaardelijk te maken. Deze functie maakt algemeen DataBindingList gebruik van alle polymorf gebruik van de traceringsfunctie van de bovenliggende klassen.

Binding met EntitySets

Binding aan EntitySet is een speciaal geval omdat EntitySet dit al een verzameling is die wordt geïmplementeerd IBindingList. LINQ aan SQL voegt ondersteuning voor sorteren en annuleren (ICancelAddNew) toe. Een EntitySet klasse maakt gebruik van een interne lijst om entiteiten op te slaan. Deze lijst is een verzameling op laag niveau op basis van een algemene matrix, de algemene ItemList klasse.

Een sorteerfunctie toevoegen

Matrices bieden een sorteermethode (Array.Sort()) die u kunt gebruiken met een Comparer van T. LINQ voor SQL gebruikt de algemene SortableBindingList.PropertyComparer klasse die eerder in dit onderwerp is beschreven om deze Comparer te verkrijgen voor de eigenschap en de richting waarop moet worden gesorteerd. Er wordt een ApplySort methode toegevoegd aan algemeen ItemList om deze functie aan te roepen.

Aan de EntitySet zijkant moet u nu sorteerondersteuning declareren:

Wanneer u een System.Windows.Forms.BindingSource gebruikt en een EntitySet<TEntity> verbindt met system.Windows.Forms.BindingSource.DataSource, moet u EntitySet<TEntity> aanroepen. GetNewBindingList om BindingSource.List bij te werken.

Als u een System.Windows.Forms.BindingSource gebruikt en de eigenschap BindingSource.DataMember instelt en BindingSource.DataSource instelt op een klasse met een eigenschap met de naam BindingSource.DataMember die de EntitySet<TEntity> beschikbaar maakt, hoeft u EntitySet<TEntity> niet aan te roepen. GetNewBindingList om de BindingSource.List bij te werken, maar u verliest de sorteermogelijkheid.

Caching

LINQ naar SQL-query's implementeren GetList. Wanneer de Windows Forms BindingSource-klasse aan deze interface voldoet, wordt GetList() drie keer aanroepen voor één verbinding. Om deze situatie te omzeilen, implementeert LINQ in SQL een cache per exemplaar om dezelfde gegenereerde verzameling op te slaan en altijd te retourneren.

Opzegging

IBindingList definieert een AddNew methode die wordt gebruikt door besturingselementen om een nieuw item te maken op basis van een afhankelijke verzameling. Het DataGridView besturingselement toont deze functie zeer goed wanneer de laatste zichtbare rij een ster in de koptekst bevat. De ster laat zien dat u een nieuw item kunt toevoegen.

Naast deze functie kan een verzameling ook worden geïmplementeerd ICancelAddNew. Met deze functie kunnen de besturingselementen annuleren of valideren dat het nieuwe bewerkte item al dan niet is gevalideerd.

ICancelAddNew wordt geïmplementeerd in alle LINQ naar SQL-gegevensverzamelingen (algemeen SortableBindingList en algemeen EntitySet). In beide implementaties wordt de code als volgt uitgevoerd:

  • Hiermee kunnen items worden ingevoegd en vervolgens uit de verzameling worden verwijderd.

  • Wijzigingen worden niet bijgehouden zolang de gebruikersinterface de editie niet doorvoert.

  • Wijzigingen worden niet bijgehouden zolang de editie is geannuleerd (CancelNew).

  • Hiermee kunt u bijhouden wanneer de editie is doorgevoerd (EndNew).

  • Hiermee kan de verzameling zich normaal gedragen als het nieuwe item niet vandaan AddNewkomt.

Probleemoplossing

In deze sectie worden verschillende items beschreven die u kunnen helpen bij het oplossen van problemen met uw LINQ naar SQL-gegevensbindingstoepassingen.

  • U moet eigenschappen gebruiken; het gebruik van alleen velden is niet voldoende. Voor Windows Forms is dit gebruik vereist.

  • imagevarbinaryStandaard worden databasetypen toegewezen timestamp aan bytematrix. Omdat ToString() deze objecten niet worden ondersteund in dit scenario, kunnen deze objecten niet worden weergegeven.

  • Een klasselid dat is toegewezen aan een primaire sleutel heeft een setter, maar LINQ naar SQL biedt geen ondersteuning voor wijziging van objectidentiteit. Daarom kan de primaire/unieke sleutel die in de toewijzing wordt gebruikt, niet worden bijgewerkt in de database. Een wijziging in het raster veroorzaakt een uitzondering wanneer u aanroept SubmitChanges.

  • Als een entiteit is gebonden in twee afzonderlijke rasters (bijvoorbeeld één master en een andere detail), wordt een Delete in het hoofdraster niet doorgegeven aan het detailraster.

Zie ook