У меня есть следующий запрос 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()
}