在 Simple.Data 中模拟子查询?

Simulate Subquery in Simple.Data?

经过广泛研究后我了解到,您不能在 Simple.Data 中执行 sub-queries。但是,如果有足够的连接和排序,我偶尔会看到一个 CTE 弹出,这将满足我的目的。我创建了一个 fiddle 来演示我想用 Simple.Data 实现什么(在 ADO.NET 之上),我只是不知道如何在 simple.data 查询(或一组查询)。

如果我有两个 tables:

CREATE TABLE Request
    (id int, 
     payload varchar(50))
;

CREATE TABLE Response
    (id int,
     requestId int,
     payload varchar(50),
     sortableValue int,
     filterField bit)
;

如何获得 child table 的筛选结果?例如

SELECT *
FROM Request ereq
JOIN
    Response eres 
    ON eres.id = (SELECT TOP 1 id from Response 
                  WHERE requestId = ereq.id AND filterField = 1
                  ORDER BY sortableValue DESC)

或具有 CTE

WITH sorted_content AS 
(
  SELECT ROW_NUMBER() OVER (PARTITION BY requestId ORDER BY sortableValue DESC) as rowId,
  *
  FROM Response
  WHERE filterField = 1
)

SELECT * 
FROM Request ereq
JOIN sorted_content sorted_eres 
     ON sorted_eres.requestId = ereq.id 
        AND sorted_eres.rowId = 1

http://sqlfiddle.com/#!6/33ac5/17

目标是能够在 Simple.Data 表达式中执行类似于上述表达式的操作,以便我可以利用分页。如果我事后过滤,分页变为 questionable/expensive.

我希望有人能想出更好的解决方案,但我们最终想出的解决方案是使用视图:

CREATE VIEW FilteredResponse
AS 
  SELECT Response1.* 
  FROM   (SELECT (SELECT TOP (1) id 
                  FROM   Response AS ri 
                  WHERE  ( requestId = ro.requestId ) 
                         AND ( filterField = 1 ) 
                  ORDER  BY sortableValue DESC) AS rid 
          FROM   (SELECT DISTINCT requestId 
                  FROM   Response) AS ro) AS sortedResponse 
         INNER JOIN Response AS Response1 
                 ON sortedResponse.rid = Response1.id 

现在下面的 SQL 产生了适当的结果:

SELECT * FROM Request ereq
JOIN FilteredResponse eres ON eres.requestId = ereq.id

这是一个非常简单的Simple.Data查询:

_db.Request.FindAll().Join(_db.FilteredResponse).On(_db.FilteredResponse.RequestId == _db.Request.Id)

完整 fiddle: http://sqlfiddle.com/#!6/fe341/3/0

我们可以解决这个问题,因为我们的 filterField 值在所有情况下都是已知的。这不适用于动态 filterField。

我仍然希望社区中的某些人能够找到一种更简洁的方法来实现它。