LINQ选择随机行

19

我有一个名为Quotes的linq-to-sql表格,包含两列:作者和引语。如何选择一行中的两列并且是随机的?

6个回答

49
Random rand = new Random();
int toSkip = rand.Next(0, context.Quotes.Count());

context.Quotes.Skip(toSkip).Take(1).First();

这行代码是做什么的:int toSkip = rand.Next(0, context.Quotes.Count);? - frenchie
它正在生成一个随机引语的索引号码。它说,选择一个0到DataContext中引语总数之间的随机数。 - Nathan Anderson
啊,好的!这是一个随机类型的扩展方法。 - frenchie
1
如果你有3个项目,然后在0到3之间进行随机,生成3,它会跳过3,取1,但是1不存在并抛出异常...难道不应该是Count-1吗? - Phill
2
传递给Random的Next函数的maxValue参数不是生成的可能值之一(生成的值始终小于maxValue)。 - Nathan Anderson
Frenchie,你的结论是不正确的。Next方法是所有Random对象上都可用的标准函数。context.Quotes.Count是指您的数据上下文和其中的Quotes表。请查看Random的文档:http://msdn.microsoft.com/en-us/library/system.random%28v=VS.100%29.aspx - Nathan Anderson

8

如果你在使用Linq-to-Objects,而不需要在SQL上工作,你可以使用ElementAt()代替更冗长的Skip(toSkip).Take(1).First()

var rndGen = new Random(); // do this only once in your app/class/IoC container
int random = rndGen.Next(0, context.Quotes.Count);
context.Quotes.ElementAt(random);

4
我是这样做的:

我像这样做:

list.ElementAt(rand.Next(list.Count());

我将随机操作,包括选择和混洗,作为扩展方法添加到一起。这样它们就可以像其他所有集合扩展方法一样使用。
你可以在文章《使用随机操作扩展LINQ》中看到我的代码。

这个Linq扩展将导致https://www.jetbrains.com/resharperplatform/help?Keyword=PossibleMultipleEnumeration。 - shtse8
1
如果您不喜欢 ReSharper 的警告,您可以随时修复它或抑制该警告。 - whiteshooz
这是针对对象的LINQ,而不是针对SQL的LINQ。 - undefined

1

这里有一种实现你想要做的事情的方法:

var quotes = from q in dataContext.Quotes select q;
int count = quotes.Count();
int index = new Random().Next(count);
var randomQuote = quotes.Skip(index).FirstOrDefault();

1

try it:

list.OrderBy(x => Guid.NewGuid()).Take(1).first();

-1

1. 首先创建一个带有 rend 属性的类

public class tbl_EmpJobDetailsEntity
{
    public int JpId { get; set; }
    public int rend
   {
    get
      {
        Random rnd = new Random();
        return rnd.Next(1, 100);
      }
    }
}

2个Linq查询

var rendomise = (from v in db.tbl_EmpJobDetails
select new tbl_EmpJobDetailsEntity
{
   JpId=v.JpId
}).OrderBy(o=>o.rend);

不对,无法转换成SQL。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接