繁体   English   中英

Linq方法返回一组随机记录

[英]Linq method to return a random set of records

我有这个功能:

/// <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;
}

这种方法有两个问题:

  • 如果选择的最后一个记录,它会返回记录比预期,也就是说,如果记录数是100,我们选择10条记录,并返回指数95它将只返回5条记录,而不是10
  • 退回的记录是有序的,它们不是混乱的。 返回的记录需要随机化,而不是按顺序存在于数据库中进行排序。

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

只需使用从Linq到Sql的Random行中的方法来执行orderby ctx.Random() .Take(sampleSize) ,并对结果执行FirstOrDefault .Take(sampleSize)而不是FirstOrDefault

您需要多少随机结果?

那么您可以从'q'中选择新的匿名随机值,然后按该随机数排序并选择最高计数。 明显的缺点是需要将所有文章读入内存而不是将选择委托给db。

另一个潜在的问题是当前方法不会以相同的概率选择每个记录。 一种简单的方法是假设需要10条记录中的9条。 当前方法只有10%的机会选择第一条记录,但总是会选择第10条记录。

似乎最好生成一组随机的记录号(如本文所述 )。 然后使用它们从结果集中选择那些条目。

1。 定义随机类实例以使其“更随机”

2。 使用以下代码选择随机元素

var result = Enumerable.Range(0, count).OrderBy(a => Rand.Next()).Take(resCount).Select(i => q[i]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM