Skapa ett DataView-objekt (LINQ till DataSet)
Det finns två sätt att skapa en DataView i LINQ till DataSet-kontexten. Du kan skapa en DataView från en LINQ till DataSet-fråga via en DataTable, eller så kan du skapa den från en skriven eller oskriven DataTable. I båda fallen skapar DataView du genom att använda någon av tilläggsmetoderna AsDataView . DataView Den är inte direkt konstruerad i LINQ-kontexten till DataSet.
När du har skapat den DataView kan du binda den till en användargränssnittskontroll i ett Windows-formulärprogram eller ett ASP.NET program, eller ändra filtrerings- och sorteringsinställningarna.
DataView konstruerar ett index, vilket avsevärt ökar prestandan för åtgärder som kan använda indexet, till exempel filtrering och sortering. Indexet för en DataView skapas både när det DataView skapas och när någon av sorterings- eller filtreringsinformationen ändras. Om du skapar en DataView och sedan anger sorterings- eller filtreringsinformationen senare skapas indexet minst två gånger: en gång när det DataView skapas och igen när någon av sort- eller filteregenskaperna ändras.
Mer information om filtrering och sortering med DataViewfinns i Filtrera med DataView och Sortering med DataView.
Skapa DataView från en LINQ till DataSet-fråga
Ett DataView objekt kan skapas från resultatet av en LINQ till DataSet-fråga, där resultatet är en projektion av DataRow objekt. Den nyligen skapade DataView ärver filtrerings- och sorteringsinformationen från den fråga som den skapas från.
Kommentar
I de flesta fall bör de uttryck som används för filtrering och sortering inte ha biverkningar och måste vara deterministiska. Dessutom bör uttrycken inte innehålla någon logik som är beroende av ett visst antal körningar, eftersom sorterings- och filtreringsåtgärderna kan köras valfritt antal gånger.
Det går inte att skapa en DataView från en fråga som returnerar anonyma typer eller frågor som utför kopplingsåtgärder.
Endast följande frågeoperatorer stöds i en fråga som används för att skapa DataView:
Observera att när en DataView skapas från en LINQ till DataSet-fråga Select måste metoden vara den sista metoden som anropas i frågan. Detta visas i följande exempel, som skapar en DataView av onlinebeställningar sorterade efter total förfallen:
DataTable orders = _dataSet.Tables["SalesOrderHeader"];
EnumerableRowCollection<DataRow> query =
from order in orders.AsEnumerable()
where order.Field<bool>("OnlineOrderFlag")
orderby order.Field<decimal>("TotalDue")
select order;
DataView view = query.AsDataView();
bindingSource1.DataSource = view;
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
Order By order.Field(Of Decimal)("TotalDue") _
Select order
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
Du kan också använda strängbaserade RowFilter egenskaper och Sort egenskaper för att filtrera och sortera en DataView när den har skapats från en fråga. Observera att detta rensar den sorterings- och filtreringsinformation som ärvs från frågan. I följande exempel skapas en DataView från en LINQ till DataSet-fråga som filtrerar efter efternamn som börjar med "S". Den strängbaserade Sort egenskapen är inställd på att sortera efter efternamn i stigande ordning och sedan förnamn i fallande ordning:
DataTable contacts = _dataSet.Tables["Contact"];
EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()
where contact.Field<string>("LastName").StartsWith("S")
select contact;
DataView view = query.AsDataView();
bindingSource1.DataSource = view;
view.Sort = "LastName desc, FirstName asc";
Dim contacts As DataTable = dataSet.Tables("Contact")
Dim query = _
From contact In contacts.AsEnumerable() _
Where contact.Field(Of String)("LastName").StartsWith("S") _
Select contact
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = "LastName desc, FirstName asc"
Skapa en DataView från en datatabell
Förutom att skapas från en LINQ till DataSet-fråga kan ett DataView objekt skapas från en DataTable med hjälp AsDataView av metoden.
I följande exempel skapas en DataView från tabellen SalesOrderDetail och den anges som datakälla för ett BindingSource objekt. Det här objektet fungerar som en proxy för en DataGridView kontroll.
DataTable orders = _dataSet.Tables["SalesOrderDetail"];
DataView view = orders.AsDataView();
bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();
Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")
Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
Filtrering och sortering kan anges efter att DataView den har skapats från en DataTable. I följande exempel skapas en DataView från tabellen Kontakt och egenskapen sorteras Sort efter efternamn i stigande ordning och sedan förnamn i fallande ordning:
DataTable contacts = _dataSet.Tables["Contact"];
DataView view = contacts.AsDataView();
view.Sort = "LastName desc, FirstName asc";
bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();
Dim contacts As DataTable = dataSet.Tables("Contact")
Dim view As DataView = contacts.AsDataView()
view.Sort = "LastName desc, FirstName asc"
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
Det finns dock en prestandaförlust som följer med att ange RowFilter egenskapen eller Sort efter att den DataView har skapats från en fråga, eftersom DataView konstruerar ett index för att stödja filtrerings- och sorteringsåtgärder. RowFilter Om du ställer in egenskapen eller Sort återskapas indexet för data, vilket ökar kostnaderna för ditt program och minskar prestandan. När det är möjligt är det bättre att ange filtrerings- och sorteringsinformationen när du först skapar DataView och undviker att ändra den efteråt.