Какова лучшая практика для записи запросов SQL внутри c# код

На моем текущем проекте я использую SQL CE. Так как это не имеет поддержки хранимых процедур, я должен записать запросы SQL в репозитории.

Опция 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 быстрее.
Какую опцию я должен принять и какова лучшая практика в этом случае?

7
задан šljaker 4 July 2010 в 21:12
поделиться

6 ответов

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

В любом случае, есть другой вариант, лучший из обоих миров: @ -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
    ";
15
ответ дан 6 December 2019 в 07:24
поделиться

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

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

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

0
ответ дан 6 December 2019 в 07:24
поделиться

Вариант 3 - используйте дословные строковые литералы :

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";
5
ответ дан 6 December 2019 в 07:24
поделиться

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

4
ответ дан 6 December 2019 в 07:24
поделиться

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

0
ответ дан 6 December 2019 в 07:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: