5

Enumerable.Contains内を使用してデータベースにクエリを実行しようとしています。SqlExpressionVisitor.Whereラムダがコンパイルされると、null 参照例外が発生します。

訪問者が のforeach (Object e in inArgs)内部 (現在は 1067 行目)にたどり着くと、が nullSqlExpressionVisitor.VisitArrayMethodCallであるためチョークします。inArgs以下は、エラーの原因となる私のサンプルです。なぜこれが起こっているのかを知るのに十分なラムダ/式を理解していません。

だから私の質問はWhere節を適切に使用していないのですか、それともバグですか?

class Program
{
    static void Main(string[] args)
    {
        var connectionFactory = new OrmLiteConnectionFactory(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Database1.mdf;Integrated Security=True;User Instance=True", SqlServerDialect.Provider);
        SetupDb(connectionFactory);           

        using (var db = connectionFactory.OpenDbConnection())
        {
            var numbersToSelect = new int[2] { 1, 2 };
            db.Select<SomeObject>(e => e.Where(o => numbersToSelect.Contains(o.Number)));
        }
    }

    static void SetupDb(IDbConnectionFactory connectionFactory)
    {
        using (var db = connectionFactory.OpenDbConnection())
        {
            db.DropTable<SomeObject>();
            db.CreateTable<SomeObject>();
            db.Insert(new SomeObject { Number = 1 });
            db.Insert(new SomeObject { Number = 2 });
            db.Insert(new SomeObject { Number = 3 });
            db.Insert(new SomeObject { Number = 4 });
            db.Insert(new SomeObject { Number = 5 });
        }
    }
}

class SomeObject
{
    public int Number { get; set; }
}

もう少し掘り下げた後、コンパイルされたメソッドを呼び出すint[]と、キャストobject[]がnullになる原因となる が返されることがわかりました。キャストするとIEnumerable、特定の問題が修正されます。

かわった

var getter = lambda.Compile();
var inArgs = getter() as object[];

var getter = lambda.Compile();
var inArgs = getter() as IEnumerable;

ただし、これがどのような意味を持つのかはわかりません(もしあれば)。まだいくつかのガイダンスを探しています。

4

2 に答える 2

2

それはバグだったことが判明しました。コミット 9f0b0e8の時点で sqlite ビジターと sql ビジターは修正されています @mythz に感謝します。

于 2013-07-19T02:54:26.817 に答える