質問

ここに私のlinqクエリがあります:

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

UserIdは、ASP.NETメンバーシップテーブルaspnet_memberに対応するメンバーテーブルのNULL値を許可するGuidフィールドです。ユーザーIDがnullである場所を選択するsubsonicを介してクエリを生成できません。nullでない場所でのみです。

ここに私の期待される出力があります:

 SELECT Id FROM Member WHERE UserId IS NULL

ここに実際の出力があります:

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

考えはありますか?デバッグ中ですが、誰か他の人がこれに遭遇した可能性があります。

役に立ちましたか?

解決

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は、NOT NOTとはほぼ同じですが、IS NOT NULLではなくIS NULLを出力します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top