Запрос SubSonic3 Linq генерирует «IS NOT NULL» вместо «IS NULL» - PullRequest
0 голосов
/ 17 сентября 2009

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

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

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

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

 SELECT Id FROM Member WHERE UserId IS NULL

вот мой фактический вывод:

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

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

1 Ответ

1 голос
/ 17 сентября 2009

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

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

...