SubSonic3 Linq查询生成“IS NOT NULL”而不是“IS NULL”

时间:2009-09-17 17:37:51

标签: c# sql linq subsonic3 nullable

这是我的linq查询:

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

UserId是成员表上可以为空的Guid字段,对应于ASP.NET成员资格表aspnet_member。我无法通过亚音速生成一个查询,该查询将选择userid IS为null的位置,仅在它不为空的位置。

这是我的预期输出:

 SELECT Id FROM Member WHERE UserId IS NULL

这是我的实际输出:

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

有什么想法?我正处于调试过程中,但也许其他人遇到了这个问题。

1 个答案:

答案 0 :(得分: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;

为Equal添加了实施。除了发出IS NULL而不是IS NOT NULL之外,它与NotEqual非常相似。