Я пытаюсь запросить мой 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;
Не уверен, какие последствия это имеет, хотя (если таковые имеются). Все еще ищут некоторые рекомендации.
Похоже, что было обновлено хранилище ORMLite около [6 часов назад] (https://github.com/ServiceStack/ServiceStack.OrmLite/commit/9f0b0e8cfa4410da5d288bf754ba6538805cbec0), связанное с этой конкретной проблемой. – Mike