2012-06-15 24 views
5

Tôi đã tự hỏi liệu có ai biết chắc chắn nếu LINQ to SQL có khả năng tạo mã TSQL có chứa hàm ISNULL không?LINQ to SQL có thể tạo TSQL có chứa hàm ISNULL không?

Tôi biết rằng việc sử dụng các nhà điều hành liên hiệp (??) trong một truy vấn:

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

sẽ gây LINQ to SQL để phát ra các COALESCE chức năng:

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

Và, đó là sử dụng toán tử điều kiện (?:) trong truy vấn:

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

sẽ cho kết quả trong TSQL chứa một tuyên bố CASE:

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

Nhưng, có thể LINQ to SQL bị cưỡng chế vào tạo mã TSQL chứa ISNULL như sau?

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

Tôi đặt cược câu trả lời là "không, không thể", nhưng tôi muốn thấy điều gì đó có thẩm quyền.

+0

@dbaseman Q bạn liên kết có vẻ không liên quan đến những gì tôi đang yêu cầu. – arcain

+0

Bạn nói đúng, sai lầm của tôi. – McGarnagle

Trả lời

3

Cách duy nhất tôi biết thực hiện điều này là thông qua lớp học của riêng bạn như vậy:

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)); 
    } 
} 

này đang được "Take # 3" từ 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(); 

Và sẽ tạo T-SQL bằng ISNULL().

+0

Tôi muốn thấy một cái gì đó mà không yêu cầu thêm phương pháp để tạo ra DataContext, nhưng tôi không nghĩ rằng tồn tại. – arcain

1

Tôi luôn coi ISNULL và COALESCE là tương đương, ngoại trừ số tham số có thể có.

Chỉ thấy rằng there are differences, vì vậy câu hỏi đặt ra là: những khác biệt này có quan trọng với bạn không?

+0

Câu hỏi của tôi là hoàn toàn về việc có thể nói "có, bạn có thể viết truy vấn LINQ to SQL sẽ phát ra TSQL chứa hàm ISNULL" hoặc "không, bạn không thể". Vì vậy, sự khác biệt về hành vi truy vấn thực sự không quan trọng với tôi. Đó là tất cả về khả năng. – arcain

Các vấn đề liên quan