выберите n случайных строк с помощью linq2sql - PullRequest
5 голосов
/ 03 марта 2010

я знаю об использовании

ORDER BY NEWID()

функция при запуске обычной команды sql. Я хочу сделать то же самое, но через linq2sql.

Я бы предпочел , а не , чтобы выбрать весь диапазон, добавить случайное число с помощью rnd.Next () и затем отсортировать по этому ...

Ответы [ 2 ]

3 голосов
/ 03 марта 2010

Марк Гравелл опубликовал здесь решение , которое позволяет вам определить функцию, которая использует NEWID в частичном классе для DataContext.Не помещайте его в сгенерированный класс DataContext, иначе будущие обновления уничтожат все, что вы добавили.

Марк показывает, как использовать его с синтаксисом выражения запроса.В качестве альтернативы, с точечной нотацией вы могли бы написать:

var results = dc.Table.OrderBy(r => dc.Random()).Take(n);

Если вы не знакомы с созданием частичного класса, просто добавьте новый класс в свое решение.Его имя не имеет значения, если в определении класса используется имя класса DataContext с ключевым словом partial.Например, если ваш DataContext с именем XYZDataContext, вы можете добавить новый класс с именем XYZDataContextPartial.cs и определить его как:

namespace YourNamespace
{
    public partial class XYZDataContext
    {
    }
}
2 голосов
/ 03 марта 2010

Попробуйте метод расширения Take:

.OrderBy(x=>x.NewId)
.Take(randomNumber);

То, что мы делаем здесь:

  1. Заказ по полю NewId в порядке ASC.
  2. Выберите первую строку N, где N - случайное число.

Если вы хотите, чтобы ордер был случайным, попробуйте это:

.OrderBy(x => Guid.NewGuid())
.Take(20);

То, что мы делаем здесь:

  1. Заказ списка в случайном порядке.
  2. Возьмите 20 верхних рядов.
...