private async Task <Author> ComplexMapFromAuthorDBToAuthor(AuthorDocument authorFromDB, Raven.Client.Documents.Session.IAsyncDocumentSession session) //Estamos usando, al pasar la sesión abierta, los datos que hemos precargado en memoria. //El límite de operaciones por sesión a base de datos ya no nos afecta (!) { var convertedAuthor = _mapper.Map <Author>(authorFromDB); //For each author, recover the mapping. // // var coursesFromDB = await session.LoadAsync<CourseDocument>(authorFromDB.CoursesIds.ToArray()); //¡Aquí se carga un diccionario porque también van los ids! Confirmar. var coursesFromDB = await session.LoadAsync <CourseDocument>(authorFromDB.CoursesIds.ToArray()); var x = coursesFromDB.Values.ToList <CourseDocument>(); var convertedCourses = _mapper.Map <List <Course> >(x); convertedAuthor.Courses = convertedCourses; return(convertedAuthor); }
//Este método nunca se llama desde el controlador: lo que ocurre es que se le llama desde el paginador // para que haga el trabajo sucio de base de datos y todo eso. public async Task <IEnumerable <Author> > GetAuthors(Raven.Client.Documents.Session.IAsyncDocumentSession session) { var authorsFromDb = await session .Query <AuthorDocument>() .OfType <AuthorDocument>() .Include(x => x.CoursesIds) //Include: cláusula de la query. Precárgame este Id y luego dámelo //(así te ahorras un viaje a base de datos). .ToListAsync(); var authors = new List <Author>(); foreach (AuthorDocument authorDB in authorsFromDb) //Iterate through all authors. { Author convertedAuthor = await ComplexMapFromAuthorDBToAuthor(authorDB, session); //Note this loads all courses for every author, but the author of those courses is empty. authors.Add(convertedAuthor); } return(authors); }
static async Task <TUserAuth> LoadOrCreateFromSessionAsync(IAuthSession authSession, Raven.Client.Documents.Session.IAsyncDocumentSession session) { TUserAuth userAuth; if (!authSession.UserAuthId.IsNullOrEmpty()) { var ravenKey = RavenIdConverter.ToString(UserAuthCollectionName, int.Parse(authSession.UserAuthId)); userAuth = await session.LoadAsync <TUserAuth>(ravenKey); } else { userAuth = authSession.ConvertTo <TUserAuth>(); } return(userAuth); }