从Linq到SQL的随机行

从Linq到SQL的随机行

当我有条件时,使用Linq到SQL检索随机行的最佳(也是最快的)方法是什么,例如某些字段必须是真的?



慕的地10843
浏览 402回答 3
3回答

慕虎7371278

我只是注意到这是LINQtoSQL,而不是LINQtoObjects。使用Marc的代码获取数据库来为您完成此操作。我把这个答案放在这里,作为LINQtoObjects的潜在兴趣点。奇怪的是,你其实不需要拿到伯爵。但是,除非得到计数,否则需要获取每个元素。您可以做的是保留“当前”值和当前计数的概念。获取下一个值时,取一个随机数,并将“Current”替换为“new”,概率为1/n,其中n是计数。所以当您读取第一个值时,总使之成为“当前”值。当您读取第二个值时,强权使其为当前值(概率为1/2)。当您读取第三个值时,强权使当前值(概率为1/3)等等,当您用完数据时,当前值是您所读取的所有值中的随机值,且概率是一致的。若要将其应用于条件,只需忽略任何不符合条件的内容。最简单的方法是首先应用WHERE子句,只考虑开头的“匹配”序列。下面是一个快速实现。我想没事的.。public&nbsp;static&nbsp;T&nbsp;RandomElement<T>(this&nbsp;IEnumerable<T>&nbsp;source, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Random&nbsp;rng){ &nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;current&nbsp;=&nbsp;default(T); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;count&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(T&nbsp;element&nbsp;in&nbsp;source) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rng.Next(count)&nbsp;==&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;=&nbsp;element; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(count&nbsp;==&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;InvalidOperationException("Sequence&nbsp;was&nbsp;empty"); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;current;}
打开App,查看更多内容
随时随地看视频慕课网APP