【问题标题】:Ormlite Where-Contains FailsOrmlite Where-Contains 失败
【发布时间】:2013-07-17 04:36:27
【问题描述】:

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

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

所以我的问题是,我没有正确使用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 hours ago 与此特定问题相关的更新。

标签: servicestack ormlite-servicestack


【解决方案1】:

不要使用包含,而是使用 Sql.In

db.Select&lt;SomeObject&gt;(e =&gt; e.Where(o =&gt; Sql.In(o.Number,numbersToSelect)));

【讨论】:

  • Sql.In 不适用于非 sql 存储 (List&lt;T&gt;)。我拥有的实际代码位于服务层中,该服务层调用将表达式作为参数的存储库。
【解决方案2】:

原来这是一个错误。从 commit 9f0b0e8 开始,它已针对 sqlite 访问者和 sql 访问者进行了修复,谢谢 @mythz。

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 2013-01-15
    • 2019-03-15
    • 2017-05-26
    • 2016-05-18
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多