2010-07-04 13 views
6

W moim bieżącym projekcie używam SQL CE. Ponieważ nie obsługuje procedur składowanych, muszę pisać kwerendy sql wewnątrz repozytorium.Co to jest najlepsza praktyka do pisania zapytań sql wewnątrz kodu C#

Wariant 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"); 

Opcja 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"; 

Wariant 1 wydaje się o wiele bardziej czytelny, zwłaszcza gdy mam 10 + tabel w przyłączyć, ale opcja 2 jest szybszy.
Którą opcję należy zaakceptować i jaka jest najlepsza praktyka w tym przypadku?

Odpowiedz

14

Opcja 2 może trwać kilka nanosekund szybciej, ale po dodaniu czasu do rzeczywistego wykonania w bazie danych (kilka milisekund) kilka dodatkowych nanaosekund ledwo rejestruje jako szum.

W każdym razie, nie ma innej opcji, że to co najlepsze z obu światów: @ -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

Dlaczego nie opcja 3:

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

jeden długi dosłowny, podzielone na wiele linii.

0

Zawsze używam drugiej metody, ponieważ jest znacznie szybsza. Używasz zbyt wielu wierszy kodu przy pomocy pierwszej metody, co prowadzi do większego narzutu.

5

Opcja 3 - używać 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 stawia SQL ciąg do plików zasobów, pozwala na łatwe pytania edycja multilinii oraz dostarcza silnie wpisane nazwie dostęp do tych zapytań nawet za pomocą etykiet narzędziowych IntelliSence.

+1

Oznacza to również, że aplikacja musi przejść i odzyskać zasób, może to być również mniejszy hit wydajnościowy. –

+0

To jest to, co robię dla złożonych poleceń SQL. Pozwala na edycję SQL tak swobodnie, jak w Management Studio, i zapewnia poprawne kolorowanie składni. Kara za wykonanie odczytu zasobu osadzonego jest nieistotna w porównaniu z trafieniem bazy danych. –

+0

Twoje prawa, to jest nieistotne w porównaniu do trafienia db ... jest mniej więcej tak samo ważne jak użycie StringBuilder. –

Powiązane problemy