2010-11-17 3 views
0

Как показано на: How to limit an SQL query to return at most one of something?Как написать SQL-версию этого запроса LINQ?

У меня есть следующие таблицы:

Платформы

  • PlatformID
  • Имя

Продукты

  • ProductID
  • Имя

Релизы

  • ID
  • ProductID
  • PlatformID
  • Версия
  • ReleaseDate

В таблице выпусков хранится каждый выпуск программного продукта для конкретной платформы. Я хочу написать запрос, чтобы вернуть последнюю версию каждого продукта для каждой платформы в таблице выпусков. И.Е. Если я выпуск продукта X версии 2.0 на платформах A, B и C, будет 3 записи в таблице Releases:

  • один для продукта X версии 2.0 на платформе A выпущен на 2010-11-17
  • один для продукта X версии 2.0 на платформе B выпущен на 2010-11-17
  • один для продукта X версии 2.0 на платформе C выпущен 2010-11-17

Итак, учитывая идентификатор продукта, как Я получаю эту информацию? Я попытался использовать GROUP BY, как и решение LINQ, которое я использовал, но, видимо, я не могу перевести LINQ на SQL, а также .NET.

ответ

2

Pedantic:

Select 
    PR.Name, 
    PL.Name, 
    REL.Version, 
    REL.ReleaseDate 
From 
    Releases As REL 
    Inner Join Products As PR 
    On REL.ProductID = PR.ProductID 
    Inner Join Platforms As PL 
    On REL.PlatformID = PL.PlatformID 
Where 
    REL.ID = (Select Top 1 Latest.ID 
      From Releases As Latest 
      Where Latest.PlatformID = REL.PlatformID 
       And Latest.ProductID = REL.ProductID 
      Order By Latest.ReleaseDate Desc) 

также должны работать (при условии, что вы никогда не убывать версии):

Select 
    PR.Name, 
    PL.Name, 
    Max(REL.Version), 
    Max(REL.ReleaseDate) 
From 
    Releases As REL 
    Inner Join Products As PR 
    On REL.ProductID = PR.ProductID 
    Inner Join Platforms As PL 
    On REL.PlatformID = PL.PlatformID 
Group By 
    PR.Name, 
    PL.Name 
+0

Большое спасибо, первое решение было совершенным. Второй вариант не был бы подходящим, так как я использовал синтаксис Major.Minor.Maintenance.Build для версий, поэтому я не думаю, что 'MAX()' обработал бы это правильно. –

2

Знаете ли вы, класс DataContext Linq имеет в Log property?

Поскольку у вас уже есть запрос LINQ, почему бы не заглянуть за занавес? :-)

+0

Ницца, спасибо за подсказку. –

Смежные вопросы