2010-07-04 4 views
6

В моем текущем проекте я использую SQL CE. Поскольку у него нет поддержки хранимых процедур, мне приходится писать sql-запросы внутри репозитория.Какова наилучшая практика написания SQL-запросов внутри кода C#

Вариант 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"); 

Вариант 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"; 

Вариант 1 кажется, гораздо более удобным для чтения, особенно когда у меня есть 10+ таблиц в присоединиться, но вариант 2 быстрее.
Какую опцию я должен принять и что является лучшей практикой в ​​этом случае?

ответ

14

Вариант 2 может быть на несколько наносекунд быстрее, но при добавлении времени для фактического выполнения в базе данных (несколько миллисекунд) несколько дополнительных nanaoseconds едва регистрируются как шум.

В любом случае, есть еще один вариант, что это лучшее из обоих миров: @ -струны:

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

Почему не вариант 3:

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

один длинный буквальным, разделить на количество строк.

0

Я всегда использую второй метод, поскольку он намного быстрее. Вы используете слишком много строк кода с помощью первого метода, что приводит к большим накладным расходам.

5

Вариант 3 - использовать 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

Я помещает SQL строку в файлы ресурсов, что позволяет легко запросов редактировать многострочный, и обеспечивает строго типизированных имени доступ к этим запросам даже с помощью всплывающих подсказок IntelliSence.

+1

Это также означает, что приложение должно идти и извлекать ресурс, может быть и незначительное повышение производительности. –

+0

Это то, что я делаю для сложных команд SQL. Он позволяет редактировать SQL так же свободно, как и в Studio Management, и обеспечивает правильную окраску синтаксиса. Снижение производительности для чтения встроенного ресурса незначительно по сравнению с ударом базы данных. –

+0

ваше право, это пренебрежимо мало по сравнению с ударом db ... это примерно так же важно, как и использование StringBuilder. –

Смежные вопросы