2010-07-04 4 views
6

In meinem aktuellen Projekt verwende ich SQL CE. Da es keine Unterstützung für gespeicherte Prozeduren gibt, muss ich SQL-Abfragen in das Repository schreiben.Was ist die beste Vorgehensweise zum Schreiben von SQL-Abfragen in C# -Code

Option 1:

StringBuilder query = new StringBuilder(); 
query.Append("SELECT"); 
query.Append(" c.CUSTOMER_ID,"); 
query.Append(" COALESCE (c.FIRST_NAME, '') + ' ' + COALESCE (c.LAST_NAME, '') AS FULL_NAME"); 
query.Append(" ct.NAME as CUSTOMER_TYPE"); 
query.Append("FROM "); 
query.Append(" CT_CUSTOMER_TYPE AS ct INNER JOIN CUSTOMER AS c ON ct.CUSTOMER_TYPE_ID = c.CUSTOMER_TYPE_ID"); 

Option 2:

string query = "SELECT c.CUSTOMER_ID, COALESCE (c.FIRST_NAME, '') + ' ' + COALESCE (c.LAST_NAME, '') AS FULL_NAME, ct.NAME as CUSTOMER_TYPE FROM CT_CUSTOMER_TYPE AS ct INNER JOIN CUSTOMER AS c ON ct.CUSTOMER_TYPE_ID = c.CUSTOMER_TYPE_ID"; 

Option 1 scheint wie ein viel besser lesbar, vor allem, wenn ich 10 + Tabellen in beitreten, aber die Option 2 ist schneller.
Welche Option sollte ich akzeptieren und was ist die beste Vorgehensweise in diesem Fall?

Antwort

14

Option 2 kann ein paar Nanosekunden schneller sein, aber wenn Sie die Zeit hinzufügen, die tatsächlich in der Datenbank ausgeführt wird (mehrere Millisekunden), werden einige zusätzliche Nanosekunden kaum als Rauschen registriert.

In jedem Fall gibt es eine weitere Option, die das Beste aus beiden Welten ist: @ -Strings:

string query = @" 
    SELECT 
     c.CUSTOMER_ID, 
     COALESCE (c.FIRST_NAME, ''_ + ' ' + COALESCE (c.LAST_NAME, '') AS FULL_NAME 
     ct.NAME as CUSTOMER_TYPE 
    FROM 
     CT_CUSTOMER_TYPE AS ct INNER JOIN CUSTOMER AS c 
      ON ct.CUSTOMER_TYPE_ID = c.CUSTOMER_TYPE_ID 
    "; 
-1

Warum nicht Option 3:

"Select bla bla bla" 
"bla bla bla" 
"...." 

eine lange wörtliche, geteilt viele Zeilen.

0

Ich benutze immer die zweite Methode, da es viel schneller ist. Sie verwenden zu viele Codezeilen mit der ersten Methode, was zu einem höheren Aufwand führt.

5

Option 3 - verwenden verbatim string literals:

string query = @" 
SELECT 
    c.CUSTOMER_ID, 
    COALESCE (c.FIRST_NAME, '') + ' ' + COALESCE (c.LAST_NAME, '') AS FULL_NAME, 
    ct.NAME as CUSTOMER_TYPE 
FROM 
    CT_CUSTOMER_TYPE AS ct 
    INNER JOIN CUSTOMER AS c 
    ON ct.CUSTOMER_TYPE_ID = c.CUSTOMER_TYPE_ID"; 
4

I SQL-String in Ressourcendateien setzt, ist es leicht zu bearbeiten mehrzeiligen Abfragen ermöglicht, und tippte bietet starken Namen Zugriff auf diese Abfragen auch mit IntelliSence-Tooltips.

+1

Das bedeutet auch, dass die App gehen und die Ressource abrufen muss, könnte auch ein kleiner Leistungseinbruch sein. –

+0

Das ist, was ich für komplexe SQL-Befehle tue. Es ermöglicht Ihnen, das SQL so frei zu bearbeiten, wie Sie in Management Studio tun würden, und bietet eine korrekte Syntaxfärbung. Die Leistungseinbuße beim Lesen der eingebetteten Ressource ist im Vergleich zu einem Datenbanktreffer vernachlässigbar. –

+0

Ihr Recht, es ist vernachlässigbar im Vergleich zu einem db-Hit ... es ist ungefähr so ​​wichtig wie die Verwendung des StringBuilder. –

Verwandte Themen