Получить случайную строку с LINQtoSQL - PullRequest
3 голосов
/ 06 мая 2009

Есть ли способ вернуть случайную строку из таблицы, используя LINQToSQL?

Ответы [ 6 ]

6 голосов
/ 06 мая 2009

Да, сгенерируйте случайное число в диапазоне количества таблиц и пропустите () это число, Take (1), а затем верните первый элемент полученной последовательности. Что-то вроде

var R = new Random();
var ToSkip = R.Next(0, ctx.Customers.Count);

return ctx.Customers.Skip(ToSkip).Take(1).First();

Но это немного уродливо. Есть ли реальное требование, которое требует получения случайной строки в таблице SQL?

0 голосов
/ 10 апреля 2010

Вы можете получить LinqToSQL для генерации SQL, который использует функцию SQLID NEWID (). Вот моя реализация:

namespace Data    // change to whatever the namespace of your DataContext is, or remove
{
    /// <summary>
    /// Add RANDOM() extension to the Data context...
    /// </summary>
    partial class DefaultDataContext  // change to the name of your DataContext
    {
        [System.Data.Linq.Mapping.Function(Name = "NEWID", IsComposable = true)]
        public Guid Random()
        {
            // this code is not actually executed, it simply provides a way to access 
            // T-SQL "NEWID()" function from Linq to SQL
            throw new NotImplementedException();
        }
    }
}

Пример использования, чтобы извлечь случайный продукт из базы данных:

var product = (from p in db.Products     // our DataContext instance is called db here
               orderby db.Random()
               select p).FirstOrDefault()
0 голосов
/ 06 мая 2009

технически:

var randomRow = (from rows in db.Table
  select shipper).First();

потому что вы никогда не можете быть уверены в порядке строк, если вы не укажете порядок по выражению.

0 голосов
/ 06 мая 2009

Я бы попробовал что-то вроде:

query.Skip(rand.Next()).Take(1).FirstOrDefault();

С инициализацией rand как возвращением числа между определенным диапазоном.

Обязательно проверьте значение null в качестве возвращаемого значения в случае, если сгенерированное случайное число было больше, чем количество строк (конечно, вы можете инициализировать его верхнюю границу как число строк).

0 голосов
/ 06 мая 2009

Никогда не пробовал, но я подозреваю, что следующее выполнит работу

Random rnd = new Random();

int count = db.MyTable.Count();
int skip = rnd.Next(count);

var row = (from r in db.MyTable
           select r).Skip(skip).Take(1);
0 голосов
/ 06 мая 2009

Вы можете использовать случайное число и Skip(), чтобы попасть в эту строку:

int randomNum = 10; // <-- determined by your favorite RNG
var row = mydb.Objects.Skip(randomNum).Take(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...