5

LINQ to SQL が関数を含む TSQL コードを生成する機能を持っているかどうかを誰かが明確に知っているかどうか疑問に思っていましたISNULLか?

??クエリで合体演算子 ( ) を使用していることは承知しています。

from o in Table
where (o.Field ?? 0) > 0
select o

LINQ to SQL が次のCOALESCE関数を発行します。

SELECT [t0].[Field]
FROM [Table] AS [t0]
WHERE (COALESCE([t0].[Field],0)) > 0

?:また、クエリで条件演算子 ( ) を使用すると、次のようになります。

from o in Table
where (o.Field == null ? 0 : o.Field) > 0
select o

CASEステートメントを含む TSQL になります。

SELECT [t0].[Field]
FROM [Table] AS [t0]
WHERE (
    (CASE
        WHEN [t0].[Field] IS NULL THEN 0
        ELSE [t0].[Amount]
     END)) > 0

しかし、LINQ to SQL は、次のような内容を含む TSQL コードを強制的に生成できISNULLますか?

SELECT [t0].[Field]
FROM [Table] AS [t0]
WHERE (ISNULL([t0].[Field],0)) > 0

答えは「いいえ、できません」だと思いますが、権威のあるものを見たいと思っています。

4

2 に答える 2

3

これを達成するために私が知っている唯一の方法は、次のような独自のクラスを使用することです。

public partial class LocalTestDataContext
{
    [Function(Name = "IsNull", IsComposable = true)]
    [return: Parameter(DbType = "NVarChar(MAX)")]
    public string IsNull(
        [Parameter(Name = "field", DbType = "NVarChar(MAX)")] string field,
        [Parameter(Name = "output", DbType = "NVarChar(MAX)")] string output)
    {
        return ((string)(this.ExecuteMethodCall(this,
                ((MethodInfo)(MethodInfo.GetCurrentMethod())),
                field, output).ReturnValue));
    }
}

ここから「Take #3」の下にあります。

var ctx = new LocalTest.LocalTestDataContext(); 

var query = from c in ctx.Categories 
orderby ctx.IsNull(c.Description1, "") + ctx.IsNull(c.Description2, "") 
select c; 
query.Dump();

また、ISNULL() を使用して T-SQL を生成します。

于 2012-06-16T19:44:32.180 に答える
1

可能なパラメーターの数を除いて、私は常に ISNULL と COALESCE が同等であると考えていました。

ただし、違いがあることわかったので、質問は次のとおりです。これらの違いはあなたにとって重要ですか?

于 2012-06-16T21:06:15.460 に答える