Linq方法返回随机记录集

Tom*_*len 1 c# linq random methods sql-server-2008

我有这个功能:

/// <summary>
/// Returns an array of random articles, ID and titles only
/// </summary>
/// <param name="SectionID">Section ID to return</param>
/// <param name="Count">Number of articles to return</param>
/// <returns></returns>
public ArticleOverview[] RandomArticles(int SectionID, int Count)
{
    ArticleOverview[] ReturnLinks;

    // Pick a random tutorial and redirect to it
    using (MainContext db = new MainContext())
    {
        // Select rows
        var q = (from c in db.tblArticles where c.IsDeleted == false && c.SectionID == SectionID select new { c.ID, c.Title });
        int count = q.Count();
        int index = new Random().Next(count);
        var Articles = q.Skip(index).Take(Count);

        // Size array
        ReturnLinks = new ArticleOverview[Articles.Count()];

        int InsertIx = 0;
        foreach (var Rec in Articles)
        {
            ReturnLinks[InsertIx] = new ArticleOverview(Rec.ID, Rec.Title, SectionID);
            InsertIx++;
        }
    }

    return ReturnLinks;
}
Run Code Online (Sandbox Code Playgroud)

此方法有两个问题:

  • 如果选择最后一个记录之一,则返回的记录将少于预期的记录;如果记录集计数为100,则IE 返回的记录将为10,并且我们选择10条记录,并且返回索引95,它将仅返回5条记录,而不返回10条记录
  • 返回的记录是有序的,它们不会混乱。返回的记录需要是随机的,并且不按顺序排列,因为它们顺序存在于数据库中。

谢谢你的帮助!我正在使用SQL Server Express 2008 R2。

Dav*_*haw 5

只需要使用此方法随机行从Sql的Linq做一个orderby ctx.Random(),做一个.Take(sampleSize)对结果,而不是FirstOrDefault