Ich versuche, meine db mit Enumerable.Contains
innerhalb einer SqlExpressionVisitor.Where
Klausel abzufragen. Wenn das Lambda kompiliert wird, erhalte ich eine Null-Referenz-Ausnahme.Ormlite Where-Contains Fails
Wenn der Besucher es foreach (Object e in inArgs)
(derzeit Zeile 1067) innerhalb SqlExpressionVisitor.VisitArrayMethodCall
macht, erstickt es, weil inArgs
Null ist. Das folgende ist mein Beispiel, das den Fehler verursacht. Ich verstehe lambdas/Ausdrücke nicht gut genug, um zu wissen, warum dies geschieht.
Also meine Fragen ist, verwende ich nicht die Where
Klausel richtig oder ist das ein Fehler?
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; }
}
Nach etwas mehr Graben, stellt sich die kompilierte Verfahren zurückkehrt eine int[]
rufend, die die Umwandlung in object[]
bewirkt null sein. Casting zu IEnumerable
behebt mein spezifisches Problem.
var getter = lambda.Compile();
var inArgs = getter() as object[];
zu
var getter = lambda.Compile();
var inArgs = getter() as IEnumerable;
nicht sicher, welche Art von Auswirkungen dies obwohl hat (falls vorhanden). Ich suche immer noch nach einer Anleitung.
Es scheint, als ob es vor ca. [6 Stunden] ein Update für das ORMLite-Repository gab (https://github.com/ServiceStack/ServiceStack.Ormlite/commit/9f0b0e8cfa4410da5d288bf754ba6538805cbec0), das mit diesem speziellen Problem zusammenhängt. – Mike