2013-07-17 5 views
5

Я пытаюсь запросить мой db, используя Enumerable.Contains внутри предложения SqlExpressionVisitor.Where. Когда лямбда скомпилирована, я получаю исключение для ссылки на null.Ormlite Where-Contains Fails

Когда посетитель делает это foreach (Object e in inArgs) (в настоящее время линия 1067) внутри SqlExpressionVisitor.VisitArrayMethodCall, он задыхается, потому что inArgs - null. Ниже приведен пример, который вызывает ошибку. Я не очень хорошо разбираюсь в лямбдах/выражениях, чтобы понять, почему это происходит.

Так что мои вопросы:, я не пользуюсь предложением 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[] быть пустым. Кастинг до IEnumerable устраняет мою конкретную проблему.

Изменено

var getter = lambda.Compile(); 
var inArgs = getter() as object[]; 

в

var getter = lambda.Compile(); 
var inArgs = getter() as IEnumerable; 

Не уверен, какие последствия это имеет, хотя (если таковые имеются). Все еще ищут некоторые рекомендации.

+0

Похоже, что было обновлено хранилище ORMLite около [6 часов назад] (https://github.com/ServiceStack/ServiceStack.OrmLite/commit/9f0b0e8cfa4410da5d288bf754ba6538805cbec0), связанное с этой конкретной проблемой. – Mike

ответ

2

Оказывается, это была ошибка. Он был исправлен для посетителя sqlite и посетителя sql от commit 9f0b0e8 Спасибо @mythz.

8

Вместо использования Содержит используйте Sql.In

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

+0

'Sql.In' не работает в не-sql-магазинах (' List '). Фактический код, который у меня есть, находится на уровне службы, который вызывает репозитории, которые принимают выражение в качестве параметра. – Chris