На моем текущем проекте я использую 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 быстрее.
Какую опцию я должен принять и какова лучшая практика в этом случае?
Вариант 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
";
Почему бы не вариант 3:
"Select bla bla bla"
"bla bla bla"
"...."
один длинный литерал, разбитый на несколько строк.
Вариант 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";
Я помещаю строку SQL в файлы ресурсов, это позволяет легко редактировать многострочные запросы и обеспечивает строго типизированный именованный доступ к этим запросам даже с помощью всплывающих подсказок IntelliSence.
Я всегда использую второй метод, так как он намного быстрее. При использовании первого метода вы используете слишком много строк кода, что приводит к большим накладным расходам.
Задумывались ли вы об использовании LINQ?
http://blogs.msdn.com/ b / matt / archive / 2008/09/09 / sql-ce-3-5-with-linq-to-sql.aspx .
http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.coalesce.aspx