I am using NHibernate and while traversing my code I came upon two functions that are called in sequence. They are probably a school example of 1) extra database round trip and 2) in-memory processing at the application side. The code involved is:
// 1) Getting the surveys in advance var surveys = DatabaseServices.Session.QueryOver<Survey>() .Where(x => x.AboutCompany.IsIn(companyAccounts.ToList())) // Actual query that can be optimized var unverifiedSurveys = DatabaseServices.Session.QueryOver<QuestionInSurvey>() .Where(x => x.Survey.IsIn(surveys.ToList())) .And(x => x.ApprovalStatus == status) .List(); // 2) In-memory processing return unverifiedSurveys.Select(x => x.Survey).Distinct() .OrderByDescending(m => m.CreatedOn).ToList(); I have read that the actual Distinct() operation with the QueryOver API can be done using 1 .TransformUsing(Transformers.DistinctRootEntity)
Could anyone give an example how the queries can be combined thus having one round trip to the database and no application-side processing?