Ich möchte, dass die Community einige Gedanken zu Linq to Sql und anderen ORM-Mappern aufgreift.
Ich mag Linq to Sql und die Idee, Datenzugriffslogik (oder CRUD-Operationen im Allgemeinen) in Ihrer Muttersprache auszudrücken, anstatt sich mit der "Impedanzfehlanpassung" zwischen C # und SQL befassen zu müssen. Um beispielsweise eine ObjectDataSource-kompatible Liste von Ereignisinstanzen für eine Geschäftsschicht zurückzugeben, verwenden wir:
return db.Events.Select(c => new EventData() { EventID = c.EventID, Title = c.Title })
Wenn ich dies mit alten SQL-to-C # -Konstrukten implementieren würde, müsste ich eine Command-Klasse erstellen, den EventID-Parameter hinzufügen (mit einer Zeichenfolge das Argument "@EventID" beschreiben) und die SQL-Abfragezeichenfolge hinzufügen Befehlsklasse, führen Sie den Befehl aus und verwenden Sie dann (vom Typ cast) nwReader ["FieldName"], um jeden zurückgegebenen Feldwert abzurufen und einem Mitglied einer neu erstellten Instanz meiner EventData-Klasse zuzuweisen (yuck).
Also, dass ist , warum Leute wie Linq / SubSonic / etc. und ich stimme zu.
Im Großen und Ganzen sehe ich jedoch eine Reihe von Dingen, die falsch sind. Meiner Meinung nach sieht Microsoft auch etwas falsch und deshalb töten sie Linq zu SQL und versuchen, Leute zu Linq zu Entitäten zu bewegen. Nur denke ich, dass Microsoft eine schlechte Wette verdoppelt.
Also, was ist los?
Das Problem ist, dass es Architekturastronauten gibt , insbesondere bei Microsoft, die Linq to Sql betrachten und erkennen, dass es sich nicht um ein echtes Datenverwaltungstool handelt: Es gibt immer noch viele Dinge, die Sie in C # nicht einfach und bequem erledigen können, und die darauf abzielen, sie zu beheben . Sie sehen dies in den Ambitionen hinter Linq to Entities, Blog-Posts über die revolutionäre Natur von Linq und sogar in der LinqPad-Herausforderung .
Und das Problem mit , dass ist , dass es davon ausgeht , dass SQL das Problem ist. Das heißt, um ein leichtes Unbehagen (Impedanzfehlanpassung zwischen SQL und C #) zu verringern, hat Microsoft das Äquivalent eines Raumanzugs (vollständige Isolierung) vorgeschlagen, wenn ein Pflaster (Linq to SQL oder ähnliches) in Ordnung wäre.
Soweit ich sehen kann, sind Entwickler ziemlich klug genug, um das relationale Modell zu beherrschen und es dann intelligent in ihren Entwicklungsbemühungen anzuwenden. In der Tat würde ich noch einen Schritt weiter gehen und sagen, dass Linq to SQL, SubSonic usw. bereits zu komplex sind: Die Lernkurve unterscheidet sich nicht wesentlich von der Beherrschung von SQL selbst. Da Entwickler auf absehbare Zeit SQL und das relationale Modell beherrschen müssen , müssen wir jetzt zwei Abfrage- / CRUD-Sprachen lernen. Schlimmer noch, Linq ist oft schwer zu testen (Sie haben kein Abfragefenster), entfernt uns eine Ebene von unserer eigentlichen Arbeit (es generiert SQL) und bietet (bestenfalls) sehr ungeschickte Unterstützung für SQL-Konstrukte wie Datumsbehandlung (zB DateDiff), "Haben" und sogar "Gruppieren nach".
Was ist die Alternative? Persönlich benötige ich kein anderes Modell für den Datenzugriff wie Linq to Entities. Ich würde es vorziehen, einfach ein Fenster in Visual Studio zu öffnen, mein SQL einzugeben und zu validieren und dann eine Taste zu drücken, um eine C # -Klasse zu generieren oder zu ergänzen, um den Aufruf zu kapseln. Da Sie SQL bereits kennen, möchten Sie nicht einfach Folgendes eingeben:
Select EventID, Title From Events Where Location=@Location
und am Ende eine EventData-Klasse haben, die A) die Felder EventID und Title als Eigenschaften enthält und B) eine Factory-Methode hat, die eine 'Location'-Zeichenfolge als Argument verwendet und eine Liste <EventData> generiert? Sie müssten sorgfältig über das Objektmodell nachdenken (das obige Beispiel behandelt das offensichtlich nicht), aber der grundlegende Ansatz, SQL weiterhin zu verwenden und gleichzeitig die Impedanzfehlanpassung zu beseitigen, gefällt mir sehr gut.
Die Frage ist: irre ich mich? Sollte Microsoft die SQL-Infrastruktur neu schreiben, damit Sie SQL / relationale Datenverwaltung nicht mehr lernen müssen? Können sie die SQL-Infrastruktur auf diese Weise neu schreiben? Oder denken Sie, dass eine sehr dünne Schicht über SQL, um das Einrichten von Parametern und den Zugriff auf Datenfelder zu vermeiden, völlig ausreicht?
Update Ich wollte zwei Links nach oben bewerben, weil ich denke, dass sie wichtige Aspekte von dem erfassen, wonach ich suche. Zunächst weist CodeMonkey auf einen Artikel mit dem Titel "Das Vietnam der Informatik" hin. Der Einstieg dauert eine Weile, ist aber eine sehr interessante Lektüre. Zweitens verweist AnSGri auf eines der bekanntesten Stücke von Joel Spolsky: Das Gesetz der undichten Abstraktionen . Es ist nicht genau zum Thema, aber es ist nah und eine gute Lektüre.
Update 2: Ich habe ocdecio die "Antwort" gegeben, obwohl es hier viele gute Antworten gibt und die Wahl der "richtigen" Antwort rein subjektiv ist. In diesem Fall stimmte seine Antwort mit dem überein, was ich angesichts des aktuellen Standes der Technik für die beste Vorgehensweise halte. Dies ist ein Bereich, von dem ich jedoch voll und ganz erwarte, dass er sich weiterentwickelt, sodass sich die Dinge möglicherweise ändern. Ich möchte mich bei allen bedanken, die dazu beigetragen haben. Ich habe alle positiv bewertet, von denen ich denke, dass sie eine nachdenkliche Antwort gegeben haben.