,
:
var resultsCount = MongoCollection
.AsQueryable()
.Where(x => x.Type == 1)
.Count();
:
var sampleSize = 10;
var rnd = new Random();
var indexes = Enumerable.Range(0, resultsCount-1);
var randomSet = indexes
.OrderBy(r => rnd.NextDouble())
.Take(sampleSize)
.ToList();
zipping:
var result = MongoCollection
.AsQueryable()
.Where(x => x.Type == 1)
.Zip(indexes, (x, y)=> Tuple.Create(x,y))
.Where(tuple => randomSet.Any(r => r == tuple.Item2))
.Take(sampleSize)
.Select(t => t.Item1)
.ToList();
It should be efficient in terms of memory, but not so networked.
This is a test for Linqpad with simulated db elements:
var resultsCount = 30;
var sampleSize = 10;
var rnd = new Random();
var indexes = Enumerable.Range(0, resultsCount-1);
var randomSet = indexes.OrderBy(r => rnd.NextDouble()).Take(sampleSize).ToList();
randomSet.OrderBy(r => r).Dump("Random set of indexes");
var db = indexes.Select(x => "Result" + x.ToString());
var sampleOfResults =
db.Zip(indexes, (x, y)=> Tuple.Create(x,y))
.Where(tuple => randomSet.Any(r => r == tuple.Item2))
.Take(sampleSize)
.Select(t => t.Item1);
sampleOfResults.ToList().Dump("Sample");
source
share