[英]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;
}
这种方法有两个问题:
谢谢你的帮助! 我正在使用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.