У меня есть следующий запрос SQL, который я пытаюсь преобразовать в LINQ.
Цель: получить первые 10 купонов из таблицы, упорядоченные по дате истечения срока их действия (т. Е. Перечислить те, которые истекают первыми), а затем случайным образом выбрать один из них для публикации.
Примечания. Из-за структуры базы данных в таблице Coupon
может быть дубликат Codes
. Поэтому я использую GROUP BY
для обеспечения различия, потому что я не могу использовать DISTINCT
в запросе дополнительного выбора (что я считаю правильным). SQL-запрос работает.
SELECT TOP 1
c1.*
FROM
Coupon c1
WHERE
Code IN (
SELECT TOP 10
c2.Code
FROM
Coupon c2
WHERE
c2.Published = 0
GROUP BY
c2.Code,
c2.Expires
ORDER BY
c2.Expires
)
ORDER BY NEWID()
Обновление:
Это так близко, как я получил, но в двух запросах:
var result1 = (from c in Coupons
where c.Published == false
orderby c.Expires
group c by new { c.Code, c.Expires } into coupon
select coupon.FirstOrDefault()).Take(10);
var result2 = (from c in result1
orderby Guid.NewGuid()
select c).Take(1);