Преобразование SQL в LINQ, вложенный выбор, верхний, «отдельный», используя группирование и несколько порядков - PullRequest
0 голосов
/ 02 марта 2011

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

Ответы [ 2 ]

0 голосов
/ 04 марта 2011

Используя слегка ошибочный ответ MercurioJ, в сочетании с другим ТАК предложенным решением случайной строки мое решение было:

var result3 = (from c in _dataContext.Coupons
                from cs in
                    ((from c1 in _dataContext.Coupons
                        where
                        c1.IsPublished == false
                        select c1).Distinct()
                        ).Take(10)
                where cs.CouponId == c.CouponId
                orderby _dataContext.NewId()
                select c).Take(1);
0 голосов
/ 02 марта 2011

Вот один из возможных способов:

from c in Coupons
from cs in 
    ((from c in coupons
        where c.published == false
        select c).Distinct()
        ).Take(10)
where cs.ID == c.ID
select c

Имейте в виду, что LINQ создает строго типизированный набор данных, поэтому оператор IN не имеет общего эквивалента.Я понимаю, что стараюсь поддерживать строгий SQL, но LINQ может быть не лучшим ответом на это.Если вы используете MS SQL Server (не SQL Server Compact), вы можете рассмотреть возможность сделать это как хранимую процедуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...