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 algemeenSortableBindingList
in 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 PropertyDescriptor
en 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:
SupportsSorting retourneert
true
.ApplySort oproepen
entities.ApplySort()
en danOnListChanged()
.SortDirection en SortProperty eigenschappen maken de huidige sorteerdefinitie beschikbaar, die wordt opgeslagen in lokale leden.
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.
image
varbinary
Standaard worden databasetypen toegewezentimestamp
aan bytematrix. OmdatToString()
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.