在 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。
我仍然希望社区中的某些人能够找到一种更简洁的方法来实现它。
经过广泛研究后我了解到,您不能在 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。
我仍然希望社区中的某些人能够找到一种更简洁的方法来实现它。