I was wondering whether anyone knows definitively if LINQ to SQL has the capability of generating TSQL code that contains the ISNULL
function?
I'm aware that using the coalesce operator (??
) in a query:
from o in Table
where (o.Field ?? 0) > 0
select o
will cause LINQ to SQL to emit the COALESCE
function:
SELECT [t0].[Field]
FROM [Table] AS [t0]
WHERE (COALESCE([t0].[Field],0)) > 0
And, that using the conditional operator (?:
) in a query:
from o in Table
where (o.Field == null ? 0 : o.Field) > 0
select o
will result in TSQL containing a CASE
statement:
SELECT [t0].[Field]
FROM [Table] AS [t0]
WHERE (
(CASE
WHEN [t0].[Field] IS NULL THEN 0
ELSE [t0].[Amount]
END)) > 0
But, can LINQ to SQL be coerced into generating TSQL code that contains ISNULL
like the following?
SELECT [t0].[Field]
FROM [Table] AS [t0]
WHERE (ISNULL([t0].[Field],0)) > 0
I'm betting the answer is "no, it can't," but I'd like to see something authoritative.
The only way I know of accomplishing this is via your own class like so:
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));
}
}
This is under "Take #3" from here.
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();
And will generate T-SQL with ISNULL().
I always considered ISNULL and COALESCE to be equivalent, except for the number of possible parameters.
Just found that there are differences, though, so the question is: do these differences matter to you?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With