gpt4 book ai didi

ServiceStack.OrmLite 在 SQL.In 过滤器中使用限制

转载 作者:行者123 更新时间:2023-12-02 03:03:00 26 4
gpt4 key购买 nike

我有一个父/子表设置 - Items/ItemDetails。这部分有效:

    var q = db.From<Item>(); //various where clauses based on request
items = db.Select<Item>(q);
q = q.Select(a => a.ITEM_NO);
itemDetails = db.Select<ItemDetail>(x => Sql.In(x.ITEM_NO, q));

尝试添加分页以提高此请求对大型数据集的性能时,我无法让 .Limit(skip, rows) 函数在子表的 SQL.In 语句中工作。

    var q = db.From<Item>().Limit(skip, rows);
items = db.Select<Item>(q);
q = q.Select(a => a.ITEM_NO);
itemDetails = db.Select<ItemDetail>(x => Sql.In(x.ITEM_NO, q));

它在第一次选择中限制结果时有效,但在子数据拉取中使用时,我得到“当子查询未使用 EXISTS 引入时,只能在选择列表中指定一个表达式。”

出来的SQL把where子查询改成:

    WHERE "ITEM_NO" IN (SELECT * FROM (SELECT  "ITEM_NO", ROW_NUMBER() OVER 
(ORDER BY "ITEM"."ITEM_NO") As RowNum
FROM "ITEM") AS RowConstrainedResult WHERE RowNum > 5 AND RowNum <= 15)

我了解 SQL 错误是因为我在 IN 子句中选择了多个列。有没有更好的写法来避免错误?

谢谢

最佳答案

如果您使用的是 SQL Server 2012 或更高版本,您应该使用 SqlServer2012Dialect.Provider,例如:

container.Register<IDbConnectionFactory>(c => 
new OrmLiteConnectionFactory(connString, SqlServer2012Dialect.Provider));

这让 OrmLite 使用 SQL Server 2012 中添加的分页支持,而不是诉诸于使用为早期版本的 SQL Server 实现分页所需的窗口函数 hack。

关于ServiceStack.OrmLite 在 SQL.In 过滤器中使用限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44707951/

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