как перевести условие «имеющий» код SQL в LinqToSQL или LinqToEntites? - PullRequest
0 голосов
/ 26 ноября 2008

Не могли бы вы рассказать, как перевести следующий код SQL в Linq To SQL или Linq To Entites?

Правильный код SQL:

выберите CollectId, URL, ID пользователя, Pubtime из группы Собрать 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 [Собрать] ON

ВСТАВИТЬ [Собрать] ([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 [Собрать] OFF

1 Ответ

2 голосов
/ 26 ноября 2008

Поскольку ваше условие «иметь» на самом деле не в агрегированном столбце, не могли бы вы просто использовать предложение «где»?

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();

Хотя я могу неправильно истолковать ваше намерение. Возможно, моя версия запроса не делает то, что вы хотите. Если это так, оставьте мне комментарий, и я удалю ответ, чтобы не перепутать вопрос.

...