Запрос SubSonic3 Linq генерирует IS NOT NULL вместо IS NULL

вот мой запрос linq:

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

UserId - это поле Guid, допускающее значение NULL, в таблице участников, которое соответствует таблице членства ASP.NET aspnet_member. Я не могу сгенерировать запрос через дозвуковой режим, который будет выбирать, где идентификатор пользователя равен нулю, только там, где он НЕ равен нулю.

вот мой ожидаемый результат:

 SELECT Id FROM Member WHERE UserId IS NULL

вот мой фактический результат:

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

Есть предположения? Я занимаюсь отладкой, но, возможно, кто-то еще столкнулся с этим.


person ryanrdl    schedule 17.09.2009    source источник


Ответы (1)


Оказывается, в методе VisitBinary не было реализации ExpressionType.Equals. Недавно был патч, который можно найти здесь:

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

Старый код был:

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 практически идентичен NotEqual, за исключением того, что выдает IS NULL вместо IS NOT NULL.

person ryanrdl    schedule 17.09.2009