SqlExpressionVisitor.Where
句の中でEnumerable.Contains
を使用してデータベースにクエリを実行しようとしています。ラムダがコンパイルされると、null参照例外が発生します。Ormlite Where-Contains Fail
foreach (Object e in inArgs)
(現行1067)にSqlExpressionVisitor.VisitArrayMethodCall
を入れた場合、inArgs
がヌルであるため、チョークします。エラーの原因となるサンプルは、次のとおりです。私はlambdas/expressionsがなぜこれが起こっているのかを知るのに十分理解していません。
私の質問はです。私は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; }
}
、それがコンパイルされたメソッドがnullであることをobject[]
にキャストを引き起こしint[]
を返して呼び出し判明。 IEnumerable
にキャストすると、私の特定の問題が修正されます。
var getter = lambda.Compile();
var inArgs = getter() as IEnumerable;
これは(もしあれば)しかし持っている意味合いがどんなものなのかわからないに
var getter = lambda.Compile();
var inArgs = getter() as object[];
を変更しました。まだいくつかのガイダンスを探しています。
この特定の問題に関連して、[6時間前](https://github.com/ServiceStack/ServiceStack.OrmLite/commit/9f0b0e8cfa4410da5d288bf754ba6538805cbec0)についてのORMLiteリポジトリへの更新があったようです。 – Mike