LINQ-to-SQL gegen gespeicherte Prozeduren? [geschlossen]

188

Ich habe mir den Beitrag "Anfängerleitfaden zu LINQ" hier auf StackOverflow ( Anfängerleitfaden zu LINQ ) angesehen, hatte aber eine Folgefrage:

Wir sind dabei, ein neues Projekt hochzufahren, bei dem fast alle unserer Datenbankoperationen relativ einfache Datenabrufe sein werden (es gibt ein anderes Segment des Projekts, das die Daten bereits schreibt). Die meisten unserer bisherigen Projekte verwenden für solche Dinge gespeicherte Prozeduren. Ich möchte jedoch LINQ-to-SQL nutzen, wenn es sinnvoller ist.

Die Frage lautet also: Welcher Ansatz ist für einfache Datenabrufe besser, LINQ-to-SQL oder gespeicherte Prozesse? Irgendwelche spezifischen Vor- oder Nachteile?

Vielen Dank.

Scott Marlowe
quelle

Antworten:

192

Einige Vorteile von LINQ gegenüber Sprocs:

  1. Typensicherheit : Ich denke, wir alle verstehen das.
  2. Abstraktion : Dies gilt insbesondere für LINQ-to-Entities . Diese Abstraktion ermöglicht es dem Framework auch, zusätzliche Verbesserungen hinzuzufügen, die Sie leicht nutzen können. PLINQ ist ein Beispiel für das Hinzufügen von Multithreading-Unterstützung zu LINQ. Codeänderungen sind minimal, um diese Unterstützung hinzuzufügen. Es wäre VIEL schwieriger, diesen Datenzugriffscode zu erstellen, der einfach Sprocs aufruft.
  3. Debugging-Unterstützung : Ich kann jeden .NET-Debugger zum Debuggen der Abfragen verwenden. Mit Sprocs können Sie SQL nicht einfach debuggen, und diese Erfahrung hängt weitgehend von Ihrem Datenbankanbieter ab (MS SQL Server bietet einen Abfrageanalysator, dies reicht jedoch häufig nicht aus).
  4. Herstellerunabhängig : LINQ arbeitet mit vielen Datenbanken und die Anzahl der unterstützten Datenbanken wird nur zunehmen. Sprocs sind nicht immer zwischen Datenbanken portierbar, entweder aufgrund unterschiedlicher Syntax oder Funktionsunterstützung (wenn die Datenbank überhaupt Sprocs unterstützt).
  5. Bereitstellung : Andere haben dies bereits erwähnt, aber es ist einfacher, eine einzelne Assembly bereitzustellen, als eine Reihe von Sprocs bereitzustellen. Dies knüpft auch an # 4 an.
  6. Einfacher : Sie müssen weder T-SQL für den Datenzugriff noch die für den Aufruf der Sprocs erforderliche Datenzugriffs-API (z. B. ADO.NET) erlernen. Dies hängt mit # 3 und # 4 zusammen.

Einige Nachteile von LINQ gegenüber Sprocs:

  1. Netzwerkverkehr : Sprocs müssen nur Sproc-Namen- und Argumentdaten über die Leitung serialisieren, während LINQ die gesamte Abfrage sendet. Dies kann sehr schlimm werden, wenn die Abfragen sehr komplex sind. Die Abstraktion von LINQ ermöglicht es Microsoft jedoch, dies im Laufe der Zeit zu verbessern.
  2. Weniger flexibel : Sprocs können das Feature-Set einer Datenbank voll ausnutzen. LINQ ist in seiner Unterstützung eher allgemein gehalten. Dies ist bei jeder Art von Sprachabstraktion üblich (z. B. C # vs Assembler).
  3. Neukompilieren : Wenn Sie Änderungen an der Art und Weise des Datenzugriffs vornehmen müssen, müssen Sie Ihre Assembly neu kompilieren, versionieren und erneut bereitstellen. Mit Sprocs kann ein DBA manchmal die Datenzugriffsroutine optimieren, ohne dass eine erneute Bereitstellung erforderlich ist .

Sicherheit und Verwaltbarkeit sind etwas, worüber sich die Leute auch streiten.

  1. Sicherheit : Sie können beispielsweise Ihre vertraulichen Daten schützen, indem Sie den Zugriff auf die Tabellen direkt einschränken und ACLs auf die Sprocs setzen. Mit LINQ, Sie können jedoch nach wie vor den direkten Zugriff auf Tabellen beschränken und stattdessen setzen ACLs auf aktualisierbaren Tabelle Ansichten ein ähnliches Ziel zu erreichen (vorausgesetzt , Ihre Datenbank unterstützt aktualisierbaren Sichten).
  2. Verwaltbarkeit : Die Verwendung von Ansichten bietet Ihnen auch den Vorteil, dass Ihre Anwendung nicht vor Schemaänderungen geschützt wird (z. B. Tabellennormalisierung). Sie können die Ansicht aktualisieren, ohne dass sich Ihr Datenzugriffscode ändern muss.

Früher war ich ein großer Sproc-Typ, aber ich fange an, mich für LINQ als bessere Alternative im Allgemeinen zu interessieren. Wenn es Bereiche gibt, in denen Sprocs deutlich besser sind, schreibe ich wahrscheinlich immer noch einen Sproc, greife aber mit LINQ darauf zu. :) :)

Chris Gillum
quelle
32
"LINQ funktioniert mit vielen Datenbanken" LINQTOSQL unterstützt jedoch nur SQL Server.
RussellH
7
LINQ to Entities funktioniert zusätzlich zu MSSQL mit Postgres und MySql. Ich bin mir nicht sicher, aber ich dachte, ich hätte gelesen, dass es etwas für Oracle gibt.
BBQchickenrobot
devart dotConnect hat ein Oracle-Ding, aber es ist verdammt fehlerhaft. Außerdem kann ich das Leistungsdefizit nicht überwinden, das entsteht, wenn ich Daten aus der Datenbank auswählen muss, um sie zu aktualisieren (Attach () ist ebenfalls möglich, aber es ist ziemlich kitschig)
Ed James
5
Ich habe hier niemanden gesehen, der die Wiederverwendung von Code erwähnt. Sie können Ihr Linq nicht in einer VB6-, Asp- oder File Maker Pro-App wiederverwenden. Wenn Sie etwas in die Datenbank aufnehmen, kann es ÜBERALL wiederverwendet werden. Sie könnten eine DLL mit Linq erstellen, aber das wird imo übermäßig kompliziert und beschissen. Das Hinzufügen einer Funktion oder eines gespeicherten Prozesses, der wiederverwendet werden kann, ist viel einfacher.
MikeKulls
Apropos Code-Wiederverwendung in TSQL (1) Viel Glück beim Versuch, die Ergebnisse einer gespeicherten Prozedur in einer temporären Tabelle zu speichern, ohne auf dynamisches SQL zurückzugreifen. (2) Sie können nicht viel tun, um alle Ihre Prozesse / Funktionen zu organisieren. Der Namespace wird schnell unübersichtlich. (3) Sie haben eine leistungsstarke select-Anweisung geschrieben, möchten aber nun, dass der Benutzer die Spalte auswählen kann, die sortiert wird. In TSQL müssen Sie möglicherweise einen CTE verwenden, der eine Zeilennummer für jede Spalte ausführt, die sortiert werden kann. in LINQ kann es mit ein paar ifAussagen im Nachhinein gelöst werden .
Sparebytes
77

Ich bin im Allgemeinen ein Befürworter, alles in gespeicherte Prozeduren zu stecken, aus all den Gründen, aus denen DBAs seit Jahren arbeiten. Im Fall von Linq gibt es zwar keinen Leistungsunterschied bei einfachen CRUD-Abfragen.

Beachten Sie jedoch einige Dinge, wenn Sie diese Entscheidung treffen: Wenn Sie ein ORM verwenden, sind Sie eng mit Ihrem Datenmodell verbunden. Ein DBA hat keine Freiheit, Änderungen am Datenmodell vorzunehmen, ohne dass Sie gezwungen sind, Ihren kompilierten Code zu ändern. Mit gespeicherten Prozeduren können Sie diese Art von Änderungen bis zu einem gewissen Grad ausblenden, da die von einer Prozedur zurückgegebene Parameterliste und die Ergebnismenge (n) ihren Vertrag darstellen und die Innereien geändert werden können, solange dieser Vertrag noch erfüllt ist .

Wenn Linq für komplexere Abfragen verwendet wird, wird das Optimieren der Datenbank zu einer viel schwierigeren Aufgabe. Wenn eine gespeicherte Prozedur langsam ausgeführt wird, kann sich der DBA vollständig auf den Code konzentrieren und verfügt über viele Optionen, sodass der Vertrag nach Abschluss des Vorgangs immer noch erfüllt ist.

Ich habe viele, viele Fälle gesehen, in denen schwerwiegende Probleme in einer Anwendung durch Änderungen am Schema und am Code in gespeicherten Prozeduren behoben wurden, ohne dass Änderungen am bereitgestellten, kompilierten Code vorgenommen wurden.

Vielleicht wäre ein Hybird-Ansatz mit Linq schön? Mit Linq können natürlich gespeicherte Prozeduren aufgerufen werden.

Eric Z Bart
quelle
9
Eine Funktion, die Sie vernachlässigt haben, ist die Sicherheit. Mit Linq müssen Sie die Tabellen direkt für die Anwendung verfügbar machen. Mit gespeicherten Prozeduren können Sie den Zugriff auf diese Prozesse einschränken und Ihre Geschäftsanforderungen durchsetzen.
NotMe
19
"Ein DBA hat keine Freiheit, Änderungen am Datenmodell vorzunehmen, ohne dass Sie gezwungen sind, Ihren kompilierten Code zu ändern." Warum würden Sie dies befürworten? Niemand sollte die "Freiheit" haben, Änderungen vorzunehmen, das ist der Punkt des Konfigurationsmanagements. Änderungen sollten vor der Bereitstellung unabhängig von der Entwicklung, dem Test usw. durchgeführt werden.
Neil Barnwell
6
@Neil: Ja, aber er kann keine Änderungen in der Entwicklungsumgebung vornehmen, ohne den Entwickler zu zwingen, den Code zu ändern.
Adam Robinson
37
Ich muss sagen, dass ich das Argument der engen Kopplung an Datenbanken oft gesehen habe, und ich bin mir nicht sicher, ob es so gültig ist. Ich bin noch nie auf eine Situation gestoßen (abgesehen von trivialen Beispielen), in der ich die Datenbank ändern möchte, für die ohnehin keine höhere Codeänderung erforderlich ist. Und wirklich, wie unterscheidet sich Linq überhaupt von gespeicherten Prozessen oder parametrisierten Abfragen? Ihre Datenzugriffsschicht sollte immer noch gut getrennt und abstrahiert sein, unabhängig davon, ob Sie ein ORM oder etwas Einfacheres verwenden. Das ist es, was Ihnen die lose Kupplung gibt, nicht welche Technologie Sie verwenden. Nur mein 2c
Simon P Stevens
7
Ich habe 199 gespeicherte Prozeduren gesehen, die unnötig für jede 1 Schemaänderung geschrieben wurden, die durch die SP-Signatur vor Anwendungen geschützt wurde, aber ähnlich wie Simon P. Stevens sagte, erforderten semantische Änderungen bei der Verwendung der SPs Anwendungsänderungen zu 100% Zeit sowieso. Ganz zu schweigen von der Tatsache, dass die Existenz der SPs nur einen zukünftigen Entwickler oder eine zukünftige Datenbank benötigt, um eine Geschäftslogik in die SP zu übertragen. Dann ein bisschen mehr und ein bisschen mehr.
64

Linq zu Sql.

Der SQL Server speichert die Abfragepläne im Cache, sodass für Sprocs kein Leistungsgewinn erzielt wird.

Andererseits werden Ihre linq-Anweisungen logisch Teil Ihrer Anwendung sein und mit dieser getestet. Sprocs sind immer etwas voneinander getrennt und schwerer zu warten und zu testen.

Wenn ich jetzt von Grund auf an einer neuen Anwendung arbeiten würde, würde ich nur Linq verwenden, keine Sprocs.

Keith
quelle
8
Ich bin nicht einverstanden mit Ihren Kommentaren zu keinem Gewinn für Sprocs. Ich habe eine Reihe von Ansätzen für den SQL Server-Zugriff auf einem Produktsystem vorgestellt und die Verwendung von gespeicherten Prepare + -Prozessen zu den besten Ergebnissen gezählt. Auch über mehrere Aufrufe derselben Logik hinweg. Vielleicht haben Sie jedoch Recht mit einer Datenbank mit geringer Auslastung.
Torial
Wenn Sie der erfahrenste Entwickler von Datenbankabfragen sind und sein werden, verwenden Sie das, was Sie am besten kennen. Im Gegensatz zum Verfahrenscode kann man nicht sagen: "Wenn es die richtige Antwort gibt, versenden Sie es."
dkretz
5
@RussellH: Dies gilt für .Net 3.5, sie festgelegt , dass in .Net 4 (sowohl für L2S und L2E)
BlueRaja - Danny Pflughoeft
3
@ Kieth Nicht der Fall! Aus Linq werden viel mehr Ausführungspläne erstellt als aus SPs. Der zu debuggende Code bietet Vorteile. Probleme beim Neukompilieren für den Bereitstellungszyklus des Unternehmens; Unflexibilität zum Testen verschiedener ACTION-Abfragen, WO, BESTELLEN NACH. Das Ändern der Reihenfolge der WHERE-Anweisung kann dazu führen, dass eine andere Abfrage verarbeitet wird. Vorabholen; Dies ist in Linq nicht einfach möglich. Die Datenschicht muss für Optimierungen verfügbar sein. SPs sind schwerer zu warten und zu testen? Wenn Sie nicht daran gewöhnt sind; SPs sind jedoch vorteilhaft für Corps und VLDBs, Hochverfügbarkeit usw.! Linq ist für kleine Projekte, Soloarbeit; Tue es.
SnapJag
4
@SnapJag - Sie haben Recht, dass Sprocs Ihnen eine feinere Kornkontrolle bieten, aber Tatsache ist, dass Sie in 99% der Fälle (selbst in den großen Unternehmenssystemen, in denen ich arbeite) keine zusätzliche Optimierung benötigen. Sprocs sind schwieriger zu warten und zu testen, ob Sie an sie gewöhnt sind oder nicht - ich bin sehr an sie gewöhnt (ich war DBA, bevor ich Entwickler war) und stelle sicher, dass der Sproc für jede CRUD-Operation für viele verschiedene Tabellen ist aktuell ist ein Schmerz. Die beste Vorgehensweise (IMHO) besteht darin, auf die einfachste Weise zu codieren, dann Leistungsprüfungen durchzuführen und nur dort zu optimieren, wo dies erforderlich ist.
Keith
40

Für das Abrufen grundlegender Daten würde ich ohne zu zögern Linq wählen.

Seit meinem Wechsel zu Linq habe ich folgende Vorteile festgestellt:

  1. Das Debuggen meines DAL war noch nie einfacher.
  2. Die Kompilierungszeitsicherheit bei Änderungen Ihres Schemas ist von unschätzbarem Wert.
  3. Die Bereitstellung ist einfacher, da alles in DLLs kompiliert ist. Keine Verwaltung von Bereitstellungsskripten mehr.
  4. Da Linq das Abfragen von Elementen unterstützt, die die IQueryable-Schnittstelle implementieren, können Sie dieselbe Syntax zum Abfragen von XML, Objekten und anderen Datenquellen verwenden, ohne eine neue Syntax erlernen zu müssen
Lomaxx
quelle
1
Für mich ist Sicherheit beim Kompilieren der Schlüssel!
BBQchickenrobot
Wenn Sie sich jedoch in einem Unternehmensteam befinden, das einen Bereitstellungszyklus hat und ein Fehler vorliegt, der schnell behoben werden muss, ist die Bereitstellung von DLLs über die Qualitätssicherung usw. wahrscheinlich strenger als der Pfad zur Bereitstellung einer einzelnen Datenbank Skript. Ihre Vorteile scheinen ein kleines Team- / Projektszenario besser darzustellen.
SnapJag
3
Die Bereitstellung von SQL-Skripten, die keine Qualitätssicherung durchlaufen müssen, ist hier nicht unbedingt eine gute Sache.
Liang
27

LINQ wird den Prozedur-Cache aufblähen

Wenn eine Anwendung LINQ to SQL verwendet und die Abfragen die Verwendung von Zeichenfolgen beinhalten, deren Länge sehr unterschiedlich sein kann, wird der SQL Server-Prozedurcache mit einer Version der Abfrage für jede mögliche Zeichenfolgenlänge aufgebläht. Betrachten Sie beispielsweise die folgenden sehr einfachen Abfragen, die für die Person.AddressTypes-Tabelle in der AdventureWorks2008-Datenbank erstellt wurden:

var p = 
    from n in x.AddressTypes 
    where n.Name == "Billing" 
    select n;

var p = 
    from n in x.AddressTypes 
    where n.Name == "Main Office" 
    select n;

Wenn diese beiden Abfragen ausgeführt werden, werden zwei Einträge im SQL Server-Prozedurcache angezeigt: Einer mit einem NVARCHAR (7) und der andere mit einem NVARCHAR (11). Stellen Sie sich nun vor, es gäbe Hunderte oder Tausende verschiedener Eingabezeichenfolgen mit unterschiedlichen Längen. Der Prozedur-Cache würde unnötigerweise mit allen möglichen Plänen für genau dieselbe Abfrage gefüllt.

Mehr hier: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363290

SQLMenace
quelle
10
Was für ein dummes Argument - verwenden Sie einfach eine Variable und Ihr Problem ist gelöst.
JohnOpincar
6
@ John, es würde nicht helfen, wenn Sie eine Validierung anstelle einer Literalzeichenfolge verwenden würden, da Sie am Ende eine Literalzeichenfolge an die Datenbank senden. Es sieht möglicherweise wie eine Variable in Ihrem Code aus, ist jedoch eine Zeichenfolge im generierten T-SQL, die an die Datenbank gesendet wird.
Kay.one
15
SQLMenace: Entsprechend der Seite, auf die Sie verlinkt haben, ist das Problem in VS2010 behoben.
Mark Byers
8
Dieses Problem war gültig, als die Antwort veröffentlicht wurde, wurde jedoch seitdem in VS2010 behoben, sodass es kein Problem mehr darstellt.
Brain2000
17

Ich denke, das Pro-LINQ-Argument scheint von Leuten zu kommen, die (im Allgemeinen) keine Geschichte mit Datenbankentwicklung haben.

Insbesondere bei Verwendung eines Produkts wie VS DB Pro oder Team Suite gelten viele der hier vorgebrachten Argumente nicht, z.

Schwieriger zu warten und zu testen: VS bietet vollständige Syntaxprüfung, Stilprüfung, Referenz- und Einschränkungsprüfung und mehr. Es bietet auch umfassende Unit-Test-Funktionen und Refactoring-Tools.

LINQ macht echte Unit-Tests unmöglich, da es (meiner Meinung nach) den ACID-Test nicht besteht.

Das Debuggen ist in LINQ einfacher: Warum? VS ermöglicht den vollständigen Einstieg in verwalteten Code und das regelmäßige Debuggen von SPs.

In eine einzige DLL kompiliert und nicht in Bereitstellungsskripten: Erneut hilft VS, vollständige Datenbanken zu erstellen und bereitzustellen oder datensichere inkrementelle Änderungen vorzunehmen.

Sie müssen TSQL nicht mit LINQ lernen: Nein, das tun Sie nicht, aber Sie müssen LINQ lernen - wo ist der Vorteil?

Ich sehe das wirklich nicht als Vorteil. In der Lage zu sein, etwas isoliert zu ändern, mag theoretisch gut klingen, aber nur weil die Änderungen einen Vertrag erfüllen, heißt das nicht, dass sie die richtigen Ergebnisse liefern. Um feststellen zu können, welche Ergebnisse korrekt sind, benötigen Sie einen Kontext, den Sie aus dem aufrufenden Code abrufen.

Ähm, lose gekoppelte Apps sind das ultimative Ziel aller guten Programmierer, da sie die Flexibilität wirklich erhöhen. Es ist fantastisch, Dinge isoliert ändern zu können, und es sind Ihre Unit-Tests, die sicherstellen, dass immer noch angemessene Ergebnisse erzielt werden.

Bevor Sie sich alle aufregen, denke ich, dass LINQ seinen Platz hat und eine große Zukunft hat. Für komplexe, datenintensive Anwendungen halte ich es jedoch nicht für bereit, gespeicherte Prozeduren zu ersetzen. Dies war eine Ansicht, die ich dieses Jahr von einem MVP bei TechEd bestätigt hatte (sie werden namenlos bleiben).

BEARBEITEN: Die Seite der gespeicherten Prozedur von LINQ zu SQL ist etwas, worüber ich noch mehr lesen muss - je nachdem, was ich finde, kann ich meine obige Diatribe ändern;)

Dr8k
quelle
4
LINQ zu lernen ist keine große Sache - es ist nur syntaktischer Zucker. TSQL ist eine ganz andere Sprache. Äpfel und Orangen.
Adam Lassek
3
Der Vorteil des Lernens von LINQ besteht darin, dass es nicht an eine einzelne Technologie gebunden ist. Die Abfragesemantik kann für XML, Objekte usw. verwendet werden. Dies wird sich im Laufe der Zeit erweitern.
Dave R.
5
Einverstanden! So viele Leute (Entwickler) suchen nach einer "Speed-to-Market" -Lösung in kleinen Teams und Projekten. Wenn die Entwicklung jedoch mit mehreren Teams, großen Datenbanken, verteilten Systemen mit hohem Volumen und hoher Verfügbarkeit auf die nächste Ebene des Unternehmensstils vorangetrieben wird, ist die Verwendung von LINQ eine andere Geschichte! Ich glaube nicht, dass Sie Ihre Meinung in zu langer Zeit ändern müssen. LINQ ist nicht für Projekte / Teams gedacht, die größer sind und mehrere Personen, mehrere Teams (Dev & DBA) und einen strengen Bereitstellungsplan haben.
SnapJag
17

LINQ ist neu und hat seinen Platz. LINQ wurde nicht erfunden, um gespeicherte Prozeduren zu ersetzen.

Hier werde ich mich auf einige Performance-Mythen & CONS konzentrieren, nur für "LINQ to SQL", natürlich könnte ich mich völlig irren ;-)

(1) Die Leute sagen, dass die LINQ-Anweisung in SQL Server "zwischengespeichert" werden kann, damit sie nicht an Leistung verliert. Teilweise wahr. "LINQ to SQL" ist eigentlich die Laufzeit, die die LINQ-Syntax in die TSQL-Anweisung übersetzt. Aus Sicht der Leistung unterscheidet sich eine fest codierte ADO.NET SQL-Anweisung nicht von LINQ.

(2) In einem Beispiel hat eine Kundendienst-Benutzeroberfläche eine "Kontoübertragungs" -Funktion. Diese Funktion selbst aktualisiert möglicherweise 10 DB-Tabellen und gibt einige Nachrichten auf einmal zurück. Mit LINQ müssen Sie eine Reihe von Anweisungen erstellen und diese als einen Stapel an den SQL Server senden. Die Leistung dieses übersetzten LINQ-> TSQL-Batches kann kaum mit der gespeicherten Prozedur mithalten. Grund? Da Sie die kleinste Einheit der Anweisung in der gespeicherten Prozedur mithilfe des integrierten SQL-Profilers und des Ausführungsplan-Tools optimieren können, können Sie dies in LINQ nicht tun.

Der Punkt ist, wenn Sie über eine einzelne DB-Tabelle und einen kleinen Datensatz CRUD sprechen, ist LINQ so schnell wie SP. Für eine viel kompliziertere Logik ist die gespeicherte Prozedur jedoch leistungsoptimierbarer.

(3) "LINQ to SQL" macht Neulinge leicht dazu, Leistungsfresser einzuführen. Jeder ältere TSQL-Typ kann Ihnen sagen, wann Sie CURSOR nicht verwenden sollen (Grundsätzlich sollten Sie CURSOR in TSQL in den meisten Fällen nicht verwenden). Mit LINQ und der charmanten "foreach" -Schleife mit Abfrage ist es für Neulinge so einfach, solchen Code zu schreiben:

foreach(Customer c in query)
{
  c.Country = "Wonder Land";
}
ctx.SubmitChanges();

Sie können sehen, dass dieser einfache anständige Code so attraktiv ist. Unter der Haube übersetzt die .NET-Laufzeit dies jedoch einfach in einen Update-Stapel. Wenn nur 500 Zeilen vorhanden sind, handelt es sich um einen TSQL-Stapel mit 500 Zeilen. Wenn es Millionen Zeilen gibt, ist dies ein Treffer. Natürlich wird ein erfahrener Benutzer diesen Job nicht verwenden, aber der Punkt ist, dass es so einfach ist, auf diese Weise zu fallen.


quelle
2
Es ist leicht, mit Zeigern in C / C ++ / C # zu scheitern. Bedeutet das, dass es niemals verwendet werden sollte?
BBQchickenrobot
1
Wie viele Programmierer mittlerer Ebene beschäftigen sich mit Zeigern? Linq setzt diese Funktion jedem Level-Codierer aus, was bedeutet, dass das Fehlerrisiko dramatisch zunimmt.
Jacques
1
Sie vergleichen Neulinge in LINQ mit älteren TSQL-Leuten. Kein wirklich fairer Vergleich. Ich würde Ihrem Code zustimmen, LINQ ist im Allgemeinen nicht für das Aktualisieren / Löschen von Stapeln geeignet. Ich würde jedoch argumentieren, dass die meisten Leistungsargumente zwischen LINQ und SP Behauptungen sind, aber nicht auf Maßnahmen basieren
liang
12

Der beste Code ist kein Code, und bei gespeicherten Prozeduren müssen Sie mindestens einen Code in die Datenbank und Code in die Anwendung schreiben, um ihn aufzurufen, während Sie bei LINQ to SQL oder LINQ to Entities keinen zusätzlichen Code schreiben müssen Code, der über jede andere LINQ-Abfrage hinausgeht, abgesehen von der Instanziierung eines Kontextobjekts.

Mark Cidade
quelle
10

LINQ hat definitiv seinen Platz in anwendungsspezifischen Datenbanken und in kleinen Unternehmen.

In einem großen Unternehmen, in dem zentrale Datenbanken als Drehscheibe für gemeinsame Daten für viele Anwendungen dienen, benötigen wir jedoch eine Abstraktion. Wir müssen die Sicherheit zentral verwalten und Zugriffshistorien anzeigen. Wir müssen in der Lage sein, Auswirkungsanalysen durchzuführen: Wenn ich eine kleine Änderung am Datenmodell vornehme, um neuen Geschäftsanforderungen gerecht zu werden, welche Abfragen müssen geändert und welche Anwendungen müssen erneut getestet werden? Ansichten und gespeicherte Prozeduren geben mir das. Wenn LINQ all das kann und unsere Programmierer produktiver macht, werde ich es begrüßen - hat jemand Erfahrung damit in einer solchen Umgebung?


quelle
2
Sie sprechen einen guten Punkt an; LINQ ist in diesem Fall keine Alternative.
Meta-Knight
1
Ihre verschiedenen Anwendungen sollten alle eine gemeinsame Datenzugriffsschicht verwenden (dies ist natürlich nicht immer der Fall). In diesem Fall können Sie eine einzige Änderung an der allgemeinen Bibliothek vornehmen und erneut bereitstellen. Sie können auch so etwas wie WCF verwenden, um den Datenzugriff für Sie zu erledigen. Es gibt eine schöne Abstraktionsebene, die mithilfe von linq technisch auf Daten hinter den Kulissen zugreifen kann. Ich denke, alles hängt nur davon ab, was Ihre Jungs für Ihre Anforderungen in Bezug auf die Verwendung von SPs gegen Linq entwickelt haben.
BBQchickenrobot
8

Ein DBA hat keine Freiheit, Änderungen am Datenmodell vorzunehmen, ohne dass Sie gezwungen sind, Ihren kompilierten Code zu ändern. Mit gespeicherten Prozeduren können Sie diese Art von Änderungen bis zu einem gewissen Grad ausblenden, da die von einer Prozedur zurückgegebene Parameterliste und die Ergebnismenge (n) ihren Vertrag darstellen und die Innereien geändert werden können, solange dieser Vertrag noch erfüllt ist .

Ich sehe das wirklich nicht als Vorteil. In der Lage zu sein, etwas isoliert zu ändern, mag theoretisch gut klingen, aber nur weil die Änderungen einen Vertrag erfüllen, heißt das nicht, dass sie die richtigen Ergebnisse liefern. Um feststellen zu können, welche Ergebnisse korrekt sind, benötigen Sie einen Kontext, den Sie aus dem aufrufenden Code abrufen.

Lomaxx
quelle
7

IMHO, RAD = LINQ, RUP = Gespeicherte Prozesse. Ich habe viele Jahre für ein großes Fortune 500-Unternehmen gearbeitet, auf vielen Ebenen, einschließlich des Managements, und ehrlich gesagt würde ich niemals RUP-Entwickler für die RAD-Entwicklung einstellen. Sie sind so dumm, dass sie nur sehr begrenzte Kenntnisse darüber haben, was auf anderen Ebenen des Prozesses zu tun ist. In einer isolierten Umgebung ist es sinnvoll, Datenbankadministratoren die Kontrolle über die Daten über ganz bestimmte Einstiegspunkte zu geben, da andere offen gesagt nicht wissen, wie das Datenmanagement am besten durchgeführt werden kann.

Aber große Unternehmen bewegen sich in der Entwicklungsbranche schmerzhaft langsam, und dies ist äußerst kostspielig. Es gibt Zeiten, in denen Sie sich schneller bewegen müssen, um Zeit und Geld zu sparen, und LINQ bietet dies und mehr in Pik.

Manchmal denke ich, dass DBAs gegen LINQ voreingenommen sind, weil sie das Gefühl haben, dass dies ihre Arbeitsplatzsicherheit gefährdet. Aber das ist die Natur des Tieres, meine Damen und Herren.

Craig
quelle
3
Ja, wir DBAs sitzen den ganzen Tag herum und warten darauf, dass Sie einen Stored Proc-Push für die Produktion anfordern. Das nicht tun zu müssen, würde uns das Herz brechen!
Sam
6

Ich denke, Sie müssen mit Procs für alles echte gehen.

A) Wenn Sie Ihre gesamte Logik in linq schreiben, ist Ihre Datenbank weniger nützlich, da nur Ihre Anwendung sie verwenden kann.

B) Ich bin sowieso nicht davon überzeugt, dass Objektmodellierung besser ist als relationale Modellierung.

C) Das Testen und Entwickeln einer gespeicherten Prozedur in SQL ist um einiges schneller als ein Kompilierungsbearbeitungszyklus in einer Visual Studio-Umgebung. Sie bearbeiten einfach F5 und drücken die Auswahltaste und schon können Sie loslegen.

D) Es ist einfacher, gespeicherte Prozeduren zu verwalten und bereitzustellen als Assemblys. Sie legen die Datei einfach auf dem Server ab und drücken F5 ...

E) Linq to SQL schreibt immer noch beschissenen Code zu Zeiten, in denen Sie ihn nicht erwarten.

Ehrlich gesagt denke ich, dass es das ultimative Ziel für MS wäre, t-sql zu erweitern, damit es implizit eine Join-Projektion durchführen kann, wie es linq tut. t-sql sollte beispielsweise wissen, ob Sie order.lineitems.part ausführen möchten.

Todd Bandrowsky
quelle
5

LINQ verbietet nicht die Verwendung gespeicherter Prozeduren. Ich habe den gemischten Modus mit LINQ-SQL und LINQ-savedproc verwendet . Persönlich bin ich froh, dass ich die gespeicherten Prozesse nicht schreiben muss ... pwet-tu.

kenny
quelle
4

Es gibt auch das Problem eines möglichen 2.0-Rollbacks. Vertrauen Sie mir, es ist mir ein paar Mal passiert, also bin ich sicher, dass es anderen passiert ist.

Ich stimme auch zu, dass Abstraktion die beste ist. Zusammen mit der Tatsache besteht der ursprüngliche Zweck eines ORM darin, RDBMS gut an die OO-Konzepte anzupassen. Wenn jedoch vor LINQ alles gut funktioniert hat, indem ein wenig von den OO-Konzepten abgewichen werden muss, dann schrauben Sie sie. Konzepte und Realität passen nicht immer gut zusammen. In der IT ist kein Platz für militante Eiferer.

DylanWoods
quelle
3

Ich nehme an, Sie meinen Linq To Sql

Für jeden CRUD-Befehl ist es einfach, die Leistung einer gespeicherten Prozedur im Vergleich zu einer beliebigen Technologie zu profilieren. In diesem Fall ist jeder Unterschied zwischen den beiden vernachlässigbar. Versuchen Sie, ein Profil für ein 5-Feldobjekt (einfache Typen) mit mehr als 100.000 ausgewählten Abfragen zu erstellen, um herauszufinden, ob es einen echten Unterschied gibt.

Auf der anderen Seite wird der eigentliche Deal-Breaker die Frage sein, ob Sie sich wohl fühlen, wenn Sie Ihre Geschäftslogik in Ihre Datenbank aufnehmen oder nicht, was ein Argument gegen gespeicherte Prozeduren ist.

Jon Limjap
quelle
1
Da mehr Orte als die Anwendung Daten beeinflussen können - Datenimporte, andere Anwendungen, direkte Abfragen usw. - ist es dumm, die Geschäftslogik nicht in die Datenbank aufzunehmen. Wenn Ihnen die Datenintegrität jedoch kein Anliegen ist, fahren Sie fort.
HLGEM
3
Geschäftslogik sollte nicht in die Datenbank aufgenommen werden. Es sollte in einer Programmiersprache vorliegen, in der es leicht zu debuggen und zu verwalten ist. Es kann dann anwendungsübergreifend als Objekte freigegeben werden. Einige Regeln befinden sich möglicherweise in der Datenbank, jedoch nicht in der Geschäftslogik.
4. Raum
3

Laut Gurus definiere ich LINQ als Motorrad und SP als Auto. Wenn Sie eine kurze Reise unternehmen möchten und nur kleine Passagiere haben (in diesem Fall 2), wählen Sie LINQ. Aber wenn du eine Reise machen und eine große Band haben willst, solltest du SP wählen.

Die Wahl zwischen Motorrad oder Auto hängt von Ihrer Route (Geschäft), Länge (Zeit) und Passagieren (Daten) ab.

Hoffe es hilft, ich kann mich irren. : D.

Kyaw Thura
quelle
1
Freunde sind auf Motorrädern gestorben: P
Alex
2
Menschen starben auch beim Autofahren.
Liang
1
Ja, du liegst falsch.
Asad Ali
3

Alle diese Antworten, die sich an LINQ orientieren, sprechen hauptsächlich von EINFACHER ENTWICKLUNG, die mehr oder weniger mit einer schlechten Qualität der Codierung oder Faulheit bei der Codierung zusammenhängt. Ich bin nur so.

Einige Vorteile oder Linq, die ich hier als einfach zu testen, leicht zu debuggen usw. gelesen habe, aber diese sind nicht mit der endgültigen Ausgabe oder dem Endbenutzer verbunden. Dies führt immer zu Leistungsproblemen des Endbenutzers. Was bringt es, viele Dinge in den Speicher zu laden und dann Filter bei der Verwendung von LINQ anzuwenden?

Auch hier ist TypeSafety darauf hingewiesen, dass "wir darauf achten, falsche Typumwandlungen zu vermeiden", was wiederum eine schlechte Qualität ist, die wir durch die Verwendung von linq verbessern möchten. Selbst in diesem Fall muss linq neu kompiliert werden, wenn sich irgendetwas in der Datenbank ändert, z. B. die Größe der String-Spalte, und wäre ohne das nicht typsicher. Ich habe es versucht.

Obwohl wir festgestellt haben, dass es bei der Arbeit mit LINQ gut, süß, interessant usw. ist, hat es den Scher-Nachteil, Entwickler faul zu machen :) und es wurde 1000-mal bewiesen, dass es im Vergleich zu Stored Procs schlecht (möglicherweise am schlechtesten) in Bezug auf die Leistung ist.

Sei nicht so faul. Ich bemühe mich sehr. :) :)

Manish
quelle
4
Alles in den Speicher laden und filtern? Linq kann Filter als Teil der Abfrage an die Datenbank senden und gibt die gefilterte Ergebnismenge zurück.
Liang
Es gibt einige Leute, die glauben, dass LINQ alle Daten lädt und sie mithilfe einer foreach-Schleife verarbeitet. Das ist falsch. Es wird nur in eine SQL-Abfrage kompiliert und bietet für die meisten CRUD-Operationen fast die gleiche Leistung. Aber ja, es ist keine Silberkugel. Es gibt Fälle, in denen sich die Verwendung von T-SQL oder gespeicherten Prozessen als besser herausstellen kann.
Es ist eine Falle
Ich stimme beiden Gegenargumenten zu. Es ist jedoch nicht ganz richtig, dass linq alle Filter an DBMS sendet, um daran zu arbeiten. Es gibt ein paar Dinge, die im Gedächtnis funktionieren. Eines davon ist anders.
Manish
2

Für einfache CRUD-Operationen mit einem einzigen Datenzugriffspunkt würde ich LINQ wählen, wenn Sie mit der Syntax vertraut sind. Für eine kompliziertere Logik denke ich, dass Sprocs in Bezug auf die Leistung effizienter sind, wenn Sie gut mit T-SQL und seinen fortgeschritteneren Operationen umgehen können. Sie haben auch die Hilfe von Tuning Advisor, SQL Server Profiler, Debuggen Ihrer Abfragen von SSMS usw.

Neo
quelle
2

Die gespeicherte Prozedur erleichtert das Testen und Sie können die Abfrage ändern, ohne den Anwendungscode zu berühren. Auch bei linq bedeutet das Abrufen von Daten nicht, dass es die richtigen Daten sind. Um die Richtigkeit der Daten zu testen, muss die Anwendung ausgeführt werden. Mit gespeicherten Prozeduren ist es jedoch einfach zu testen, ohne die Anwendung zu berühren.

dansasu11
quelle
1

Das Ergebnis kann wie folgt zusammengefasst werden

LinqToSql für kleine Websites und Prototypen. Das spart wirklich Zeit für das Prototyping.

Sps: Universal. Ich kann meine Abfragen optimieren und immer ActualExecutionPlan / EstimatedExecutionPlan überprüfen.

pokrate
quelle
1
Create PROCEDURE userInfoProcedure
    -- Add the parameters for the stored procedure here
    @FirstName varchar,
    @LastName varchar
AS
BEGIN

    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT FirstName  , LastName,Age from UserInfo where FirstName=@FirstName
    and LastName=@FirstName
END
GO

http://www.totaldotnet.com/Article/ShowArticle121_StoreProcBasic.aspx

totaldonet
quelle
4
Was ist der Sinn davon?
Teoman Shipahi
0

Sowohl LINQ als auch SQL haben ihre Plätze. Beide haben ihre Nachteile und Vorteile.

Manchmal benötigen Sie für den komplexen Datenabruf gespeicherte Prozesse. Und manchmal möchten Sie vielleicht, dass andere Personen Ihren gespeicherten Prozess in SQL Server Management Studio verwenden.

Linq to Entities eignet sich hervorragend für die schnelle CRUD-Entwicklung.

Sicher können Sie eine App nur mit der einen oder anderen erstellen. Oder Sie können es verwechseln. Alles hängt von Ihren Anforderungen ab. Aber gespeicherte SQL-Prozesse werden nicht so schnell verschwinden.

Live-Liebe
quelle