在C#代码中编写SQL查询的最佳实践是什么?

6

在我的当前项目中,我正在使用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";

在我需要联接10个以上的表格时,选项1似乎更易读,但选项2更快。那么我该选择哪个选项?在这种情况下,最佳实践是什么?

7个回答

16

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

7

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

4

我把SQL字符串放入资源文件中,这样可以轻松编辑多行查询,并且即使使用IntelliSence工具提示,也可以提供强类型的命名访问该查询。


1
这也意味着应用程序必须去检索资源,这可能会对性能造成轻微影响。 - Chase Florell
这是我在处理复杂 SQL 命令时的做法。它让你像在 Management Studio 里一样自由地编辑 SQL,并提供适当的语法高亮显示。与数据库查询相比,读取嵌入资源所带来的性能损失微不足道。 - Christian Hayter
你是对的,与数据库查询相比,它微不足道...这就像使用StringBuilder一样重要。 - Chase Florell

0
为什么不选择选项3呢?
"Select bla bla bla"
"bla bla bla"
"...."

一个长字面量,分成多行。


0

我总是使用第二种方法,因为它更快。使用第一种方法会消耗太多的代码行,导致开销更大。


0

我习惯于这种方法:

  1. 使用 + 运算符,在编译时添加字符串,而不是运行时 (https://learn.microsoft.com/en-us/dotnet/csharp/how-to/concatenate-multiple-strings)
  2. 此语法在运行时不应更改,使用 const。
  3. 使用缩进来格式化脚本。

目标是保持可读性并减少数据传输,没有运行时性能成本:),完美。

    string const 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接