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