2009-09-17 144 views
0

這裏是我的LINQ查詢:SubSonic3 Linq查詢生成 「IS NOT NULL」,而不是 「IS NULL」

var test = from m in db.Members where m.UserId == null select m.Id; 
     test.ToList(); 

用戶ID是在該部件上表可爲空GUID字段對應於ASP.NET成員表aspnet_member。我無法通過subsonic生成一個查詢,該查詢將選擇userid爲null的地方,只有它不爲null的地方。

這裏是我的預期輸出:

SELECT Id FROM Member WHERE UserId IS NULL 

這裏是我的實際輸出:

SELECT Id FROM Member WHERE UserId IS **NOT** NULL 

有什麼想法?我正在調試過程中,但也許有人遇到了這個問題。

回答

1

原來在VisitBinary方法中沒有ExpressionType.Equals的實現。有最近,可以在這裏找到一個補丁:

[http://github.com/subsonic/SubSonic-3.0/blob/master/SubSonic.Core/Linq/Structure/TSqlFormatter.cs][1]

舊的代碼爲:

case ExpressionType.Equal: 
case ExpressionType.NotEqual: 
    if (right.NodeType == ExpressionType.Constant) 
       { 
        ConstantExpression ce = (ConstantExpression)right; 
        if (ce.Value == null) 
        { 
         this.Visit(left); 
         sb.Append(" IS NOT NULL"); 
         break; 
        } 
       } 
       else if (left.NodeType == ExpressionType.Constant) 
       { 
        ConstantExpression ce = (ConstantExpression)left; 
        if (ce.Value == null) 
        { 
         this.Visit(right); 
         sb.Append(" IS NOT NULL"); 
         break; 
        } 
       } 
       goto case ExpressionType.LessThan; 

的實施增加了對平等。與NotEqual非常相似,除了發出IS NULL而不是IS NOT NULL。