01 August 2007

Blicke ich zurück auf meinen früheren Post, hat sich bei der Zusammenarbeit von ASP.NET und LINQ in der neusten Beta 2 von Visual Studio 2008 (Codename Orcas) viel getan.

ASP.NET Anwendungen können jetzt problemlos die neuen .NET 3.5 Assemblys einbinden und deren Features nutzen.

Für Webentwickler steht sogar die neue LinqDataSource bereit, die den Zugriff von allen Data-Bound-Controls wie GridView, ListView, DataRepeater etc. auf einen Linq to Sql DataContext gewährt und neben automatischem Sorting und Paging auch Insert-, Upadte- und Delete-Querys unterstützt.

Ist ein Linq-to-Sql DataContext im AppCode Folder oder in einer referenzierten Assembly vorhanden, kann man wie bei der Sql Data Source gewohnt mit dem Visual Designer arbeiten. Probleme bereiten noch Where-Conditions und komplexe Queries, doch in der LinqDataSource steckt mehr als Microsoft offen zugeben will.

Das Selecting Event der LinqDataSource bietet einem die Möglichkeit die vordefinierte Linq Query über den Parameter e.Result zu erstetzten. Dabei ist man nicht auf den Linq-to-Sql DataContext beschränkt, sondern kann jede beliebige Linq Query verwenden (z.B. Linq-to-Objects, Linq-to-Entities, Linq-to-Amazon, etc.) und das ohne den Verlust von Sorting und Paging.

Hier eine kleine Demonstration

ASP .NET Declaration

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" DataSourceID="PersonSource" />
<asp:LinqDataSource ID="PersonSource" runat="server" />

ASP .NET Code

Partial Class _Default Inherits System.Web.UI.Page

    Protected Sub PersonSource_Selecting(ByVal sender As Object, ByVal e As     System.Web.UI.WebControls.LinqDataSourceSelectEventArgs) Handles PersonSource.Selecting
        Dim persons As Person() = New Person() {New Person With {.Name = "Jan", .Age = 19}, New Person With {.Name = "Albert", .Age = 23}, New Person With {.Name = "Robert", .Age = 61}}
        e.Result = From x In persons
                   Where x.Age > 20
    End Sub
End Class

Public Class Person
    Private _Name As String
    
    Public Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property
    
    Private _Age As Integer
    
    Public Property Age() As Integer
        Get
            Return _Age
        End Get
        Set(ByVal value As Integer)
            _Age = value
        End Set
    End Property
End Class

In diesem Beispiel wird ein einfaches GridView mit Sorting und Paging an eine LinqDataSource gebunden. Im Code wird eine Klasse Person definiert mit den Eigenschaften Name und Age. Im Selecting Event werden einige Person Objekte erstellt. Daraufhin werden mit einer Linq Query diejenigen Person Objekte herausgefiltert, deren Age Eigenschaft größer als 20 ist.

Um sich nun von der Flexibilität der LinqDataSource zu überzeugen muss man lediglich die Anwendung starten.

Fazit

Man sieht, dass das ASP.NET Team in den letzten Monaten nicht geschlafen hat, sondern neben der Erstellung der AJAX-Extension und neuen WebControls auch noch die Linq Integration deutlich verbessert hat.

Zwar sind die Query Funktionen noch nicht sehr ausgereift, mit einem kleinen Workaround lässt sich dies aber spielend meistern.

Ab jetzt werde ich immer mehr Linq in meinen ASP.NET Projekten einsetzten!



blog comments powered by Disqus