Имитировать подзапрос в Simple.Data?

Насколько я понял после обширных исследований, вы не можете выполнять подзапросы в Simple.Data. Однако при достаточном количестве объединений и сортировок я иногда видел всплывающее окно CTE, которое могло служить моим целям. Я создал скрипт, чтобы продемонстрировать, чего я хотел бы достичь с помощью Simple.Data (поверх ADO.NET), я просто не могу понять, как структурировать это в запросе simple.data (или наборе запросов) .

Если у меня есть две таблицы:

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

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

Как я могу получить отфильтрованный верхний результат дочерней таблицы? например

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)

или с КТР

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, чтобы я мог использовать разбиение по страницам. Если я фильтрую постфактум, пейджинг становится сомнительным/дорогим.


person Jaime Torres    schedule 18.03.2015    source источник
comment
я не понимаю, что вы действительно хотите?   -  person Khurram Ali    schedule 19.03.2015
comment
Я хочу знать, как написать выражение simple.data, которое будет создавать SQL (или что-то подобное)   -  person Jaime Torres    schedule 19.03.2015


Ответы (1)


Я надеюсь, что кто-нибудь предложит лучшее решение, но решение, к которому мы наконец пришли, заключалось в использовании представления:

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)

Полная скрипка: http://sqlfiddle.com/#!6/fe341/3/0< /а>

Нам это сойдет с рук, потому что значение нашего filterField известно для всех случаев. Это не будет работать для динамического filterField.

Я все еще надеюсь, что кто-то из сообщества сможет найти более чистый способ реализовать это.

person Jaime Torres    schedule 25.03.2015