2010-07-04 138 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

相關問題