What is the best practice for writing sql queries inside c# code

烂漫一生 提交于 2019-12-04 04:16:05

Option 2 may be a few nanoseconds faster, but when you add the time to actually execute in the database (several milliseconds) a few extra nanaoseconds barely registers as noise.

In any case, there is another option that's the best of both worlds: @-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
    ";

Option 3 - use 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";

I puts SQL string into resource files, it allows easy edit multiline queries, and provides strongly typed named access to that queries even with IntelliSence tooltips.

Why not option 3:

"Select bla bla bla"
"bla bla bla"
"...."

one long literal, split to many lines.

I always use the second method as it is much faster. You use up too many lines of code with the first method, leading to a larger overhead.

I'm used to this approach:

  1. use +, this operator will add string at compile, not run time (https://docs.microsoft.com/en-us/dotnet/csharp/how-to/concatenate-multiple-strings)
  2. this syntax shouldn't change at run time, use const.
  3. use indent to format script well.

The goal purpose is keeping readability and reduces data transfer, and there's no run-time performance cost :) , perfect.

    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;";
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!