Databindning
LINQ till SQL stöder bindning till vanliga kontroller, till exempel rutnätskontroller. Mer specifikt definierar LINQ till SQL de grundläggande mönstren för bindning till ett datarutnät och hantering av huvudinformationsbindning, både när det gäller visning och uppdatering.
Underliggande princip
LINQ till SQL översätter LINQ-frågor till SQL för körning på en databas. Resultatet är starkt skrivet IEnumerable
. Eftersom dessa objekt är vanliga CLR-objekt (Common Language Runtime) kan vanlig objektdatabindning användas för att visa resultatet. Å andra sidan kräver ändringsåtgärder (infogningar, uppdateringar och borttagningar) ytterligare steg.
Åtgärd
Implicit bindning till Windows Forms-kontroller utförs genom att implementera IListSource. Datakällor som är generiska Table<TEntity> (Table<T>
i C# eller Table(Of T)
Visual Basic) och generiska DataQuery
har uppdaterats för att implementera IListSource. Användargränssnitt (UI) databindningsmotorer (Windows Forms och Windows Presentation Foundation) testar båda om deras datakälla implementerar IListSource. Att skriva en direkt påverkan av en fråga till en datakälla för en kontroll anropar därför implicit LINQ till SQL-samlingsgenerering, som i följande exempel:
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
Samma sak gäller för 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
Samlingsgenerationer implementeras av generiska Table<TEntity> och generiska DataQuery
i GetList.
Implementering av IListSource
LINQ till SQL implementerar IListSource på två platser:
Datakällan är : Table<TEntity>LINQ till SQL bläddrar i tabellen för att fylla i en
DataBindingList
samling som har en referens i tabellen.Datakällan är en IQueryable<T>. Det finns två scenarier:
Om LINQ till SQL hittar den underliggande Table<TEntity> från IQueryable<T>tillåter källan utgåva och situationen är densamma som i den första punktpunkten.
Om LINQ till SQL inte kan hitta den underliggande Table<TEntity>, tillåter källan inte utgåva (till exempel
groupby
). LINQ till SQL bläddrar i frågan för att fylla i en allmänSortableBindingList
, vilket är en enkel BindingList<T> som implementerar sorteringsfunktionen för T-entiteter för en viss egenskap.
Specialiserade samlingar
För många funktioner som beskrivs tidigare i det här dokumentet BindingList<T> har specialiserat sig på vissa olika klasser. Dessa klasser är generiska SortableBindingList
och generiska DataBindingList
. Båda deklareras som interna.
Allmän sorterbarbindningslista
Den här klassen ärver från BindingList<T>och är en sorterbar version av BindingList<T>. Sortering är en minnesintern lösning och kontaktar aldrig själva databasen. BindingList<T> implementerar IBindingList men stöder inte sortering som standard. Implementerar IBindingList dock BindingList<T> med virtuella kärnmetoder. Du kan enkelt åsidosätta dessa metoder. Allmänna SortableBindingList
åsidosättningar SupportsSortingCore, SortPropertyCore, SortDirectionCoreoch ApplySortCore. ApplySortCore
anropas av ApplySort och sorterar listan med T-objekt för en viss egenskap.
Ett undantag utlöses om egenskapen inte tillhör T.
För att uppnå sortering skapar LINQ till SQL en generisk SortableBindingList.PropertyComparer
klass som ärver från generiska IComparer.Compare och implementerar en standardjäxare för en viss typ T, en PropertyDescriptor
och en riktning. Den här klassen skapar dynamiskt en Comparer
av T där T är PropertyType
PropertyDescriptor
för . Sedan hämtas standardjäxaren från den statiska generiska Comparer
. En standardinstans erhålls med reflektion.
Generic SortableBindingList
är också basklassen för DataBindingList
. Generic SortableBindingList
erbjuder två virtuella metoder för att pausa eller återuppta objekt som lägger till/tar bort spårning. Dessa två metoder kan användas för basfunktioner som sortering, men kommer verkligen att implementeras av överklasser som generiska DataBindingList
.
Allmän DataBindingList
Den här klassen ärver från generiska SortableBindingLIst
. Generic DataBindingList
behåller en referens till den underliggande generiska Table
generiska IQueryable
filen som används för den första fyllningen av samlingen. Generic DatabindingList
lägger till spårning för objekttillägg/borttagning i samlingen genom att InsertItem
åsidosätta () och RemoveItem
(). Den implementerar också funktionen för att pausa/återuppta spårning för att göra spårningen villkorsstyrd. Den här funktionen gör att generiska DataBindingList
dra nytta av all polymorf användning av spårningsfunktionen i de överordnade klasserna.
Bindning till EntitySets
Bindning till EntitySet
är ett specialfall eftersom EntitySet
det redan är en samling som implementerar IBindingList. LINQ till SQL lägger till stöd för sortering och avbokning (ICancelAddNew). En EntitySet
klass använder en intern lista för att lagra entiteter. Den här listan är en lågnivåsamling baserad på en generisk matris, den generiska ItemList
klassen.
Lägga till en sorteringsfunktion
Matriser erbjuder en sorteringsmetod (Array.Sort()
) som du kan använda med en Comparer
av T. LINQ till SQL använder den generiska SortableBindingList.PropertyComparer
klassen som beskrivs tidigare i det här avsnittet för att hämta detta Comparer
för egenskapen och riktningen som ska sorteras på. En ApplySort
metod läggs till i generisk ItemList
för att anropa den här funktionen.
På sidan EntitySet
måste du nu deklarera sorteringsstöd:
SupportsSorting returnerar
true
.ApplySort anropar
entities.ApplySort()
och sedanOnListChanged()
.SortDirection och SortProperty egenskaper exponerar den aktuella sorteringsdefinitionen, som lagras i lokala medlemmar.
När du använder system.Windows.Forms.BindingSource och binder en EntitySet<TEntity> till System.Windows.Forms.BindingSource.DataSource måste du anropa EntitySet<TEntity>. GetNewBindingList för att uppdatera BindingSource.List.
Om du använder en System.Windows.Forms.BindingSource och anger egenskapen BindingSource.DataMember och anger BindingSource.DataSource till en klass som har en egenskap med namnet i BindingSource.DataMember som exponerar EntitySet<TEntity>, behöver du inte anropa EntitySet<TEntity>. GetNewBindingList för att uppdatera BindingSource.List men du förlorar sorteringsfunktionen.
Cachelagring
LINQ till SQL-frågor implementerar GetList. När klassen Windows Forms BindingSource uppfyller det här gränssnittet anropas GetList() tred.tid för en enda anslutning. För att undvika den här situationen implementerar LINQ till SQL en cache per instans som ska lagras och returnerar alltid samma genererade samling.
Annullering
IBindingList definierar en AddNew metod som används av kontroller för att skapa ett nytt objekt från en bunden samling. Kontrollen DataGridView
visar den här funktionen mycket bra när den sista synliga raden innehåller en stjärna i rubriken. Stjärnan visar att du kan lägga till ett nytt objekt.
Förutom den här funktionen kan en samling även implementera ICancelAddNew. Med den här funktionen kan kontrollerna avbryta eller verifiera att det nya redigerade objektet har verifierats eller inte.
ICancelAddNew implementeras i alla LINQ-till SQL-databundna samlingar (generiska SortableBindingList
och generiska EntitySet
). I båda implementeringarna utförs koden på följande sätt:
Låter objekt infogas och sedan tas bort från samlingen.
Spårar inte ändringar så länge användargränssnittet inte checkar in utgåvan.
Spårar inte ändringar så länge utgåvan avbryts (CancelNew).
Tillåter spårning när utgåvan har checkats in (EndNew).
Låter samlingen bete sig normalt om det nya objektet inte kommer från AddNew.
Felsökning
I det här avsnittet beskrivs flera objekt som kan hjälpa dig att felsöka dina LINQ-till SQL-databindningsprogram.
Du måste använda egenskaper. det räcker inte att bara använda fält. Windows Forms kräver den här användningen.
Som standard
image
mappas ,varbinary
ochtimestamp
databastyper till bytematris. EftersomToString()
det inte stöds i det här scenariot kan dessa objekt inte visas.En klassmedlem som mappas till en primärnyckel har en setter, men LINQ till SQL stöder inte ändring av objektidentitet. Därför kan inte den primära/unika nyckel som används i mappningen uppdateras i databasen. En ändring i rutnätet orsakar ett undantag när du anropar SubmitChanges.
Om en entitet är bunden i två separata rutnät (till exempel en huvuddel och en annan detalj) sprids inte en
Delete
i huvudrutnätet till detaljrutnätet.