Próbuję przesłać zapytanie do bazy danych za pomocą Enumerable.Contains
w klauzuli SqlExpressionVisitor.Where
. Po skompilowaniu lambda otrzymuję wyjątek odwołania o wartości zerowej.Ormlite Where-Contains Fails
Gdy użytkownik przejdzie do foreach (Object e in inArgs)
(obecnie wiersz 1067) wewnątrz SqlExpressionVisitor.VisitArrayMethodCall
, dławi się, ponieważ inArgs
ma wartość null. Oto moja próbka, która powoduje błąd. Nie rozumiem lambdas/wyrażeń wystarczająco dobrze, aby wiedzieć, dlaczego tak się dzieje.
Moje pytania brzmią:, czy nie używam poprawnie klauzuli Where
, czy jest to błąd?
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; }
}
Po trochę więcej kopania, okazuje się, nazywając skompilowany metoda jest zwrócenie int[]
co powoduje obsadę do object[]
być zerowa. Przesyłanie do IEnumerable
rozwiązuje mój konkretny problem.
Zmieniono
var getter = lambda.Compile();
var inArgs = getter() as object[];
do
var getter = lambda.Compile();
var inArgs = getter() as IEnumerable;
Nie wiesz, jakie konsekwencje ma to jednak (jeśli występują). Nadal szukam wskazówek.
Wygląda na to, że aktualizacja repozytorium ORMLite około [6 godzin temu] (https://github.com/ServiceStack/ServiceStack.OrmLite/commit/9f0b0e8cfa4410da5d288bf754ba6538805cbec0) jest związana z tym konkretnym problemem. – Mike