【发布时间】:2011-09-20 17:50:48
【问题描述】:
我有这个功能:
/// <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;
}
这种方法有两个问题:
- 如果它选择最后一条记录,它将返回 less 条记录,如果记录集计数为 100 并且我们选择 10 条记录,它返回索引 95 它只会返回 5 条记录而不是 10
- 返回的记录是有序的,它们不是杂乱无章的。返回的记录需要随机化而不是排序,因为它们在数据库中是按顺序存在的。
感谢您的帮助!我正在使用 SQL Server Express 2008 R2。
【问题讨论】:
-
Random row from Linq to Sql 的可能重复项
-
@Ahmad,谢谢我已经看到并使用该方法,问题是它只适用于返回单个记录而不是一组。
-
你确定吗?我相信您可以使用 Marc 的方法并使用
Queryable.Takemethod 来获取多条记录:dc.Customers.OrderBy(x => dc.Random()).Take(5)。我相当确定这是可能的,因为我过去曾使用过这种方法。它们首先以随机顺序返回,然后是TakeN 条已经随机化的记录。 -
@哦,哇,我很笨,谢谢!我只是不明白他的回答,但经过仔细阅读,我现在明白了,谢谢,对不起!
标签: c# linq sql-server-2008 random methods