首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LLBLGEN选择带联接的TOP 100

使用LLBLGEN选择带联接的TOP 100
EN

Stack Overflow用户
提问于 2012-05-10 14:44:48
回答 1查看 1.3K关注 0票数 0

我使用LLBLgen作为ORM,并希望实现以下目标:

Table1

SessionId

Table2

SessionId

时间戳

代码语言:javascript
复制
SELECT TOP 100 * FROM Table1
INNER JOIN Table2 ON Table1.SessionId = Table2.SessionId
ORDER BY Table2.Timestamp DESC

这段代码在Server 2008 R2上直接执行时运行良好--如果可用的话,从Table1返回100行,但不知怎么的,我无法用LLBLGen实现相同的结果。目前我仍然使用2.6,但是如果需要的话,更新是一种选择。

是否有可能在LLBLGen中实现此行为?

如果我在LLBLGen中使用正常机制,这就是结果。

代码语言:javascript
复制
SELECT * FROM Table1
INNER JOIN Table2 ON Table1.SessionId = Table2.SessionId
ORDER BY Table2.Timestamp DESC

顺便说一句:我读到LLBLGen从读者那里获得了前100个结果,然后终止了连接。尽管如此,与直接执行SQL相比,使用LLBLGen查询花费的时间要长得多(令我惊讶的是,对于后者的查询也是如此!)

EN

回答 1

Stack Overflow用户

发布于 2012-05-16 13:16:09

它没有添加TOP,因为这样可能会返回重复的行,因为您有一个联接,而且在查询中存在这样一种情况(您没有发布真正的查询),在投影中存在明显违反类型化字段的情况。

通常情况下,当获取实体时,llblgen pro会在您的情况下添加顶部,并且是不同的。如果它不能添加distinct,因为您的查询返回图像、ntext、文本类型的字段,或者在投影中的字段上排序(所以不能应用distinct,否则sqlserver会抛出一个错误),那么它也不会添加TOP,因为这可能意味着您在受TOP限制的集合中得到可能重复的行,这些行被过滤掉,因为实体总是唯一的。

示例:基于订单筛选器(因此使用联接)获取客户,将在northwind上创建客户内部连接订单,但由于这是1:n关系,它将创建副本。如果客户包含文本、图像或ntext字段,则不能应用distinct,因此如果我们指定TOP,您将得到重复的行。由于llblgen从不将重复行具体化到实体中,因此返回的实体将少于所需的值。

因此,在这种情况下,它会切换到客户端限制:一旦读取了实体的#(而不是行!),它就会终止连接!这是你要的。因此,如果您请求10个实体,并且在前10010行中有10000个重复行,那么至少将获得10000行。

所以我的猜测是table2上的排序,这是问题所在,因为这防止了区分的发出。这是sqlserver上的非法查询:

从客户选择不同的C.CompanyName,C内部连接订单O on c.CustomerId = o.CustomerId ORDER,由o.OrderDate DESC;

原因是ORDER附加了一个隐藏的列,以便对所有不在投影中的字段进行排序,这会破坏不同的字段。这在RDBMS中很常见.

所以TL;DR:这是一个特征:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10536491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档