как перевести код SQL, имеющий & # 8221; условие в LinqToSQL или LinqToEntites?

StackOverflow https://stackoverflow.com/questions/319800

Вопрос

Не могли бы вы рассказать, как перевести следующий код 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();

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top