Tengo un código como este donde quiero consultar a MongoDB usando Linq.
Obtengo un AsQueryable de la colección MongoDB.
public IEnumerable<IVideo> GetVideos() { var collection = database.GetCollection<IVideo>("Videos"); return collection.AsQueryable(); }yo lo llamo así,
var finalList = Filter2(Filter1(GetVideos())).Skip(2).Take(30); foreach(var v in finalList) { .... }Funciones con las consultas.
public IEnumerable<IVideo> Filter1(IEnumerable<IVideo> list) { return list.Where(q=>q.Categorized) } public IEnumerable<IVideo> Filter2(IEnumerable<IVideo> list) { var query = from d in list where d.File == "string1" || d.File == "string2" select d; return query; }Mi código funciona bien. Tengo mi código alojado en un IIS y tengo alrededor de 50.000 registros y las consultas son un poco más complejas que las del ejemplo. Mi proceso de trabajo aumenta al 17 % y tarda unos segundos en ejecutarse cuando se llama a foreach. Este es un alto ridículo para una cantidad de fecha tan baja.
Tengo un par de preguntas.
Gracias
Estás descargando todas las entradas del lado del cliente por accidente
public IEnumerable<IVideo> Filter1(IEnumerable<IVideo> list) { var list = list.Where(q=>q.Categorized) } IEnumerable hace que el queryable se ejecute y devuelva resultados. Cambie los métodos de filtro para aceptar y devolver IQueryable .
EDITAR:
El código que publicaste:
public IEnumerable<IVideo> Filter1(IEnumerable<IVideo> list) { var list = list.Where(q=>q.Categorized) }No compila.
Su código debería verse así:
public IQueryable<IVideo> Filter1(IQueryable<IVideo> qVideos) { return qVideos.Where(q => q.Categorized); } public IQueryable<IVideo> Filter2(IQueryable<IVideo> qVideos) { return qVideos .Where(e => e.File == "string1" || e.File == "string2"); } public DoSomething() { // This is the query, in debug mode you can inspect the actual query generated under a property called 'DebugView' var qVideos = Filter2(Filter1(GetVideos())) .Skip(1) .Take(30); // This runs the actual query and loads the results client side. var videos = qVideos.ToList(); // now iterated foreach (var video in videos) { } }