Ormlite Where-Contains失败

时间:2013-07-17 04:36:27

标签: servicestack ormlite-servicestack

我正在尝试使用Enumerable.Contains子句中的SqlExpressionVisitor.Where查询我的数据库。编译lambda时,我得到一个空引用异常。

当访问者访问foreach (Object e in inArgs)内的SqlExpressionVisitor.VisitArrayMethodCall(当前行1067)时,它会因为inArgs为空而窒息。以下是导致错误的示例。我不太了解lambda /表达式,知道为什么会发生这种情况。

所以我的问题是,我没有正确使用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;

不确定这有什么影响(如果有的话)。仍在寻找一些指导。

2 个答案:

答案 0 :(得分:8)

使用Sql.In

而不是使用Contains

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

答案 1 :(得分:2)

原来这是一个错误。从commit 9f0b0e8开始为sqlite访问者和sql访问者修复了它。感谢@mythz。