2010-07-04 140 views
6

在我当前的项目中,我使用的是SQL CE。由于它不支持存储过程,所以我必须在存储库中编写sql查询。在c#代码中编写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速度更快。
我应该接受哪种选择?在这种情况下,最佳做法是什么?

回答

14

选项2可能会快几纳秒,但是当您添加时间在数据库中实际执行时(几毫秒),几个额外的nanaoseconds几乎不会注册为噪声。

在任何情况下,还有另外一个选择那就是两全其美:@ -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

为什么不选择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

这也意味着应用程序必须去检索资源,也可能是一个次要的性能。 – 2010-07-04 21:30:57

+0

这就是我为复杂的SQL命令所做的。它允许您像在Management Studio中那样自由编辑SQL,并提供适当的语法着色。与数据库命中相比,读取嵌入式资源的性能损失可以忽略不计。 – 2010-07-04 21:40:34

+0

你的权利,与数据库命中相比,它是微不足道的......它和使用StringBuilder一样重要。 – 2010-07-04 22:13:15

相关问题