我使用LLBLgen作为ORM并希望实现以下目标:
表1 :
的SessionID表2 :
SESSIONID
时间戳
SELECT TOP 100 * FROM Table1
INNER JOIN Table2 ON Table1.SessionId = Table2.SessionId
ORDER BY Table2.Timestamp DESC
此代码在SQL Server 2008 R2上直接执行时运行正常 - 如果可用,则从Table1返回100行,但不知何故,我无法使用LLBLGen获得相同的结果。目前我仍在使用2.6,但如果需要,可以选择更新。
是否有可能在LLBLGen中实现此行为?
如果我在LLBLGen
中使用常规机制,这就是结果SELECT * FROM Table1
INNER JOIN Table2 ON Table1.SessionId = Table2.SessionId
ORDER BY Table2.Timestamp DESC
BTW:我读到LLBLGen从读者那里获得了前100名的结果然后杀死了连接。尽管如此,与直接执行SQL相比,使用LLBLGen的查询需要更长的时间(这让我感到意外,对于后面的查询也很重要!)
答案 0 :(得分:1)
它不会添加TOP,因为您可能会返回重复行,因为您有一个连接,并且您的查询中存在一种情况(您没有发布真实查询),您的投影中有不同的违规类型字段。
通常,在获取实体时,llblgen pro会在您的案例和DISTINCT中添加TOP。如果它不能添加distinct,因为你的查询返回了image,ntext,text类型的字段,或者你对不在投影中的字段排序(因此不能应用distinct,否则sqlserver会抛出错误),它也不会添加TOP,因为这可能意味着你在由TOP限制的集合中获得潜在的重复行,这些行被过滤掉,因为实体总是唯一的。
实施例: 基于Order上的过滤器(所以使用连接)获取客户将在northwind上创建Customers INNER JOIN Orders,但由于这是1:n关系,因此它将创建重复项。如果Customers包含text,image或ntext字段,则不能应用distinct,因此如果我们指定TOP,您将获得重复的行。由于llblgen pro从未将重复行实现为实体,因此您将获得的实体数量少于您要求的值。
因此,在 THIS 特定情况下,它会切换到客户端限制:一旦读取了您要求的实体数量(不是行!),它就会终止连接。因此,如果您要求10个实体并且前10010行中有10000个重复行,则至少会获取10000行。
所以我的猜测是table2上的排序问题,因为这会阻止DISTINCT被发出。这是对sqlserver的非法查询:
SELECT DISTINCT C.CompanyName FROM Customers C INNER JOIN在c.CustomerId = o.CustomerId上订购O ORDER BY o.OrderDate DESC;
原因是ORDER BY为所有字段附加一个隐藏列,以对不在投影中的字段进行排序,从而破坏了不同的字段。这在RDBMS-s中很常见。
所以TL; DR:这是一个特色:)