Конвертировать SQL в Linq To SQL - PullRequest
0 голосов
/ 23 декабря 2010

У меня есть следующий запрос SQL, который я хотел бы преобразовать в LinqToSql

SELECT recWishList.AppId, phyDM.Name,
DATEADD(dd, DATEDIFF(dd, 0, recWishList.Timestamp), 0) AS Date,
COUNT(recWishList.Timestamp) AS Downloads
FROM 
dbo.RecommendWishlist recWishList
INNER JOIN VirtualDevice virDevice
on recWishList.VirtualDeviceId = virDevice.Id
INNER JOIN PhysicalDeviceModel phyDM
on virDevice.PhysicalDeviceModelId = phyDM.Id
GROUP BY 
AppId, phyDM.Name, DATEADD(dd, DATEDIFF(dd, 0, recWishList.Timestamp), 0) 

Вычисление столбца «Дата», приведенное выше, является хаком, который часто используется для извлечения компонента времени из значения даты и времени, по существу, устанавливающего компонент времени на ноль.

Результирующий набор результатов выглядит следующим образом:

AppId                                   Model           Date                  Downloads
0219d640-6e56-4c09-be8a-a4dc4777bf31    M1           2010-08-30 00:00:00.000 1
04d2de8b-646f-4433-8738-76103344e6b2    M2           2010-12-06 00:00:00.000 1
07d09852e9ca439cb0c573c8292e64f5     M2           2010-08-25 00:00:00.000 1
07d09852e9ca439cb0c573c8292e64f5     M2           2010-09-13 00:00:00.000 1
07d09852e9ca439cb0c573c8292e64f5     M1           2010-08-25 00:00:00.000 2

Мой эквивалент L2S выглядит следующим образом:

from app in RecommendWishlists
join virtualDevice in VirtualDevices on app.VirtualDeviceId equals virtualDevice.Id
join physicalDeviceModel in PhysicalDeviceModels on virtualDevice.PhysicalDeviceModelId       equals physicalDeviceModel.Id
group app by new {app.AppId, Model=physicalDeviceModel.Name, Date =    SqlMethods.DateDiffDay(DateTime.Parse("1/1/1753"),app.Timestamp)} into gApp
select new {App = gApp.Key.AppId, Model = gApp.Key.Model, Date = gApp.Key.Date}

Результат выглядит следующим образом:

AppId                                   Model           Date                    
0219d640-6e56-4c09-be8a-a4dc4777bf31    M1           94108 
04d2de8b-646f-4433-8738-76103344e6b2    M2           94206
07d09852e9ca439cb0c573c8292e64f5    M2           94103 

На данном этапе запрос работает, но у меня еще нет столбца «COUNT (Timestamp)», и я пытаюсь выяснить, как представить это в LinqToSql. Кроме того, дата представляется как границы даты из функции DateDiff, а не как реальные значения даты и времени. Может кто-нибудь взглянуть на мой перевод L2S и посмотреть, если я что-то упустил? Кроме того, как я могу получить количество временных меток, добавленных к этому переводу?

============ UPDATE ==================

Из приведенного ниже руководства Джона окончательный запрос Linq выглядит следующим образом: -

from recwishlist in RecommendWishlists
join virdevice in VirtualDevices on recwishlist.VirtualDeviceId equals virdevice.Id 
join phydm in PhysicalDeviceModels on virdevice.PhysicalDeviceModelId equals phydm.Id 
group new {recwishlist, phydm} by new {
   recwishlist.AppId,
   phydm.Name, 
   Date =SqlDateTime.MinValue.Value.AddDays(
             SqlMethods.DateDiffDay(SqlDateTime.MinValue.Value,recwishlist.Timestamp))
   } into gApp
   select new {
 gApp.Key.AppId,
 gApp.Key.Name,  
 gApp.Key.Date,
 Downloads = (Int64?)gApp.Count()
}

1 Ответ

0 голосов
/ 23 декабря 2010

Похоже, вам нужно ссылаться на «gApp.Key.Timestamp» вместо «app.Timestamp», поскольку вы выбираете из «gApp», а «app» больше не находится в контексте.

Редактировать

Итак, ваша текущая проблема - подсчет. Это должно быть так просто, как:

select new {App = gApp.Key.AppId, Model = gApp.Key.Model, Date = gApp.Key.Date, Count = gApp.Count() }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...