【问题标题】:Linq method to return a random set of recordsLinq 方法返回一组随机记录
【发布时间】: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.Take method 来获取多条记录:dc.Customers.OrderBy(x =&gt; dc.Random()).Take(5)。我相当确定这是可能的,因为我过去曾使用过这种方法。它们首先以随机顺序返回,然后是 TakeN 条已经随机化的记录。
  • @哦,哇,我很笨,谢谢!我只是不明白他的回答,但经过仔细阅读,我现在明白了,谢谢,对不起!

标签: c# linq sql-server-2008 random methods


【解决方案1】:

1 .定义 Random 类实例使其“更随机”

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

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

【讨论】:

    【解决方案2】:

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

    似乎最好生成一组随机的记录号(例如described in this post)。然后使用这些从结果集中选择这些条目。

    【讨论】:

      【解决方案3】:

      您需要的结果有多随机?

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

      【讨论】:

        【解决方案4】:

        只需使用Random row from Linq to Sql 中的方法执行orderby ctx.Random() 并在结果上执行.Take(sampleSize) 而不是FirstOrDefault

        【讨论】:

        • 戴夫,这正是我现在正在做的事情,除了按顺序返回的记录,这就是问题所在!
        • 如果您使用“orderby ctx.Random()”方法,那么所有项目都将按随机顺序排列。
        • 没问题 - 在我重新阅读并意识到它没有意义之后,我确实必须编辑我的答案以添加关于使用“orderby ctx.Random()”的内容。 :o.
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-29
        • 2016-10-24
        • 2012-03-31
        • 1970-01-01
        • 2012-01-02
        • 1970-01-01
        相关资源
        最近更新 更多