2013-07-17 15 views
5

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.

+0

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

Odpowiedz

2

Okazuje się, że był to błąd. Zostało to naprawione dla użytkownika sqlite i użytkownika sql od commit 9f0b0e8 Thanks @mythz.

8

Zamiast Zawiera użyć Sql.In

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

+0

'Sql.In' nie działa w magazynach innych niż sql (' List '). Rzeczywisty kod, który mam, znajduje się w warstwie usługowej, która wywołuje repozytoria, które pobierają wyrażenie jako parametr. – Chris