как перевести код SQL, имеющий & # 8221; условие в LinqToSQL или LinqToEntites?
-
11-07-2019 - |
Вопрос
Не могли бы вы рассказать, как перевести следующий код SQL в Linq To SQL или Linq To Entites?
Правильный код SQL:
выберите CollectId, URL, идентификатор пользователя, время публикации из группы Собрать url, collectid, userid, pubtime, имеющий pubtime > = (выберите max (pubtime) из собирать d, где d.url = collect.url) упорядочить по Collect.pubtime desc
Сценарий таблицы базы данных:
если существует (выберите * из системных объектов) где id = OBJECT_ID ('[Collect]') и OBJECTPROPERTY (id, 'IsUserTable') = 1) DROP TABLE [Собрать]
CREATE TABLE [Collect] ([CollectId] [int] IDENTITY (1, 1) NOT NULL, [Url] [nvarchar] (200) NULL, [UserId] [nvarchar] (50) NULL, [PubTime] [datetime] NULL)
ALTER TABLE [Собрать] С NOCHECK ДОБАВИТЬ CONSTRAINT [PK_Collect] ПЕРВИЧНЫЙ КЛЮЧ НЕКЛАСТЕРНЫЙ ([CollectId]) SET IDENTITY_INSERT [Собрать] ВКЛ
ВСТАВИТЬ [Собрать] ([CollectId], [URL], [UserId], [PubTime]) ЦЕННОСТИ ( 1, 'www.sohu.com', 'Mike', '2008-10-10 0:00:00 ') ВСТАВИТЬ [Собрать] ([CollectId], [URL], [UserId], [PubTime]) ЦЕННОСТИ ( 2, 'www.echina365.com', 'Lily', '2008-10-15 0:00:00 ') ВСТАВИТЬ [Собрать] ([CollectId], [URL], [UserId], [PubTime]) ЦЕННОСТИ ( 3, 'www.php.com', 'Том', '2008-10-20 0:00:00 ') ВСТАВИТЬ [Собрать] ([CollectId], [URL], [UserId], [PubTime]) ЦЕННОСТИ ( 4, 'www.echina365.com', 'Yaoming', '2008-10-23 0:00:00 ') ВСТАВИТЬ [Собрать] ([CollectId], [URL], [UserId], [PubTime]) ЦЕННОСТИ ( 5, 'www.echina365.com', 'Mike', '2008-10-25 0:00:00 ') ВСТАВИТЬ [Собрать] ([CollectId], [URL], [UserId], [PubTime]) ЦЕННОСТИ ( 6, 'www.sohu.com', 'Jack', '2008-10-26 0:00:00 ') ВСТАВИТЬ [Собрать] ([CollectId], [URL], [UserId], [PubTime]) ЦЕННОСТИ ( 7 'www.echina365.com', 'Трейси', '2008-11-2 0:00:00 ') ВСТАВИТЬ [Собрать] ([CollectId], [URL], [UserId], [PubTime]) ЦЕННОСТИ ( 8 'www.php.com', 'Yaoming', '2008-11-5 0:00:00' ) р>
SET IDENTITY_INSERT [Собрать] ВЫКЛ.
Решение
Поскольку у вас есть " условие на самом деле не для агрегированного столбца, не могли бы вы просто использовать " где " пункт?
select distinct CollectId, url, userid, pubtime
from Collect
where pubtime >= (select max(pubtime) from collect d where d.url = collect.url)
order by Collect.pubtime desc
Это дает тот же результат, что и указанный вами набор данных. Тогда оператор LINQ становится достаточно простым:
var rows = (from c in Collect
where c.PubTime >= (
from d in Collect
where d.Url == c.Url
select d.PubTime).Max()
orderby c.PubTime descending
select c).Distinct();
Хотя я могу неправильно истолковать ваше намерение. Возможно, моя версия запроса не делает то, что вы хотите. Если это так, оставьте мне комментарий, и я удалю ответ, чтобы не перепутать проблему.