Recogí un fragmento de código que usa el controlador MongoDB como este para obtener un solo objeto de una colección... esto no puede ser correcto, ¿verdad? ¿Hay una mejor manera de conseguir esto?
IMongoCollection<ApplicationUser> userCollection; .... userCollection.FindAsync(x => x.Id == inputId).Result.ToListAsync().Result.Single();Sí hay.
En primer lugar, no use FindAsync , use Find en su lugar. En el resultado de IFindFluent use el método de extensión SingleAsync y espere la tarea devuelta dentro de un método asíncrono:
async Task MainAsync() { IMongoCollection<ApplicationUser> userCollection = ...; var applicationUser = await userCollection.Find(_ => _.Id == inputId).SingleAsync(); } El nuevo controlador usa async-await exclusivamente. No lo bloquees usando Task.Result .
Debe limitar su consulta antes de ejecutar, de lo contrario, primero encontrará todos los resultados y luego solo leerá uno de ellos.
Puede especificar el límite usando FindOptions en FindAsync o usar la sintaxis fluida para limitar la consulta antes de ejecutarla:
var results = await userCollection.Find(x => x.Id == inputId).Limit(1).ToListAsync(); ApplicationUser singleResult = results.FirstOrDefault(); El resultado de ToListAsync será una lista, pero dado que limitó la cantidad de resultados a 1, esa lista solo tendrá un único resultado al que puede acceder mediante Linq.
En las versiones más nuevas de MongoDB, Find() está en desuso, por lo que puede usar
collection.FindSync(o => o.Id == myId).Single()o
collection.FindAsync(o => o.Id == myId).Result.Single() También puede usar SingleOrDefault() , que devuelve un valor nulo si no se encuentra ninguna coincidencia en lugar de generar una excepción.