2013-07-17 9 views
5

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.

Changed
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.

+0

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

Antwort

2

Stellt sich heraus, es ist ein Fehler war. Es wurde für den SQLite-Besucher und den SQL-Besucher ab commit 9f0b0e8 behoben. Danke @mythz.

8

Anstelle der Verwendung enthält, verwenden Sql.In

db.Select<SomeObject>(e => e.Where(o => Sql.In(o.Number,numbersToSelect)));

+0

'Sql.In' funktioniert nicht auf Nicht-SQL-Stores (' List '). Der tatsächliche Code, den ich habe, befindet sich in einer Service-Schicht, die Repositories aufruft, die einen Ausdruck als Parameter annehmen. – Chris