gpt4 book ai didi

servicestack - Ormlite Where-Contains 失败

转载 作者:行者123 更新时间:2023-12-04 17:22:45 25 4
gpt4 key购买 nike

我正在尝试使用 Enumerable.Contains 查询我的数据库里面SqlExpressionVisitor.Where条款。编译 lambda 时,我收到空引用异常。

当访客到达 foreach (Object e in inArgs) (当前第 1067 行)内部 SqlExpressionVisitor.VisitArrayMethodCall ,它窒息是因为 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;

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

最佳答案

使用 Sql.In 而不是使用 contains
db.Select<SomeObject>(e => e.Where(o => Sql.In(o.Number,numbersToSelect)));

关于servicestack - Ormlite Where-Contains 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17691194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com