2011-06-16 34 views
5

与此question如何内C#写长长的SQL查询的关系,解决方案建议,长的SQL查询应该写成:逐字字符串文字中的替换? 。

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 
    "; 

这让我好奇的另一个相关的问题。我能以某种方式使用替代吗?也就是说,如果说表名更改但查询保持不变,我将如何管理?我是否必须回到使用字符串连接构建字符串的其他方法,还是有更优雅的方式?

回答

19

为什么不使用string.Format?在你给具体的例子,你可以不喜欢

string query = @" 
SELECT 
    c.CUSTOMER_ID, 
    COALESCE (c.FIRST_NAME, ''_ + ' ' + COALESCE (c.LAST_NAME, '') AS FULL_NAME 
    ct.NAME as CUSTOMER_TYPE 
FROM 
    {0} AS ct INNER JOIN {1} AS c 
     ON ct.CUSTOMER_TYPE_ID = c.CUSTOMER_TYPE_ID 
"; 

而且调用

string real_query = string.Format(query, tblName1, tblName2); 
+0

这是一个很好的回应和想法。 – 2013-04-15 02:08:03

4

是的,你可以使用String.Format方法。

string custtype = "CT_CUSTOMER_TYPE"; 
string cust = "CUSTOMER"; 
string query = @" 
SELECT 
    c.CUSTOMER_ID, 
    COALESCE (c.FIRST_NAME, ''_ + ' ' + COALESCE (c.LAST_NAME, '') AS FULL_NAME 
    ct.NAME as CUSTOMER_TYPE 
FROM 
    {0} AS ct INNER JOIN {1} AS c 
     ON ct.CUSTOMER_TYPE_ID = c.CUSTOMER_TYPE_ID 
"; 

string endQuery = String.Format(query, custtype, cust); 

String.Format方法将取代通过{X}用字符串以下的参数顺序地识别的参数,所以{0}将与custtype的值来代替,和{1}使用的值卡斯特。

1

如果您还没有,可以考虑使用LINQ to SQL。

回答实际问题时,如果您正在创建查询,则可以使用string.Format,正如其他人提到的一样。如果您希望修改现有的字符串,请尝试使用string.ReplaceRegex.Replace,如here所述。那就是:

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 
    "; 
query.Replace("CT_CUSTOMER_TYPE", "NEW_TABLE_NAME");