Anybody know of a way to batch NHibernate queries using NHibernate.Linq like you can do with MultiCriteria and ICriteria objects?
With MultiCriteria I can create somethi
NHibernate.Linq itself uses NHibernateQueryTranslator to translate from the LINQ expression to an ICriteria. You could do this too, then pass the resulting ICriteria into your IMultiCriteria.
I have a solution that enables both batching a fetching strategies using NHibernate Linq, but the code is king of complex. It's too much to list here. I am going to be talking about it on my blog on devlicio.us pretty soon. I'll update this comment when I write the first post.
var query = from q in session.Linq<Person>()
where q.FirstName.StartsWith(firstName)
&& q.LastName.StartsWith(lastName)
&& q.Phones.Any(p => p.Number.Contains(phone))
select q;
// This block of code was found in the NHibernate.Linq source
// using NHibernate.Linq.Visitors;
// using NHibernate.Engine;
System.Linq.Expressions.Expression expression = query.Expression;
expression = Evaluator.PartialEval(expression);
expression = new BinaryBooleanReducer().Visit(expression);
expression = new AssociationVisitor((ISessionFactoryImplementor)session.SessionFactory).Visit(expression);
expression = new InheritanceVisitor().Visit(expression);
expression = CollectionAliasVisitor.AssignCollectionAccessAliases(expression);
expression = new PropertyToMethodVisitor().Visit(expression);
expression = new BinaryExpressionOrderer().Visit(expression);
NHibernateQueryTranslator translator = new NHibernateQueryTranslator(session);
object results = translator.Translate(expression, ((INHibernateQueryable)query).QueryOptions);
// My LINQ query converted to ICriteria
ICriteria resultsCriteria = results as ICriteria;
// Convert to criteria that returns the row count
ICriteria rowCountCriteria = CriteriaTransformer.TransformToRowCount(resultsCriteria);
IList multiResults = session.CreateMultiCriteria()
.Add(resultsCriteria.SetMaxResults(20))
.Add(rowCountCriteria)
.List();
IList people = (IList)multiResults[0];
int resultsCount = (int)((IList)multiResults[1])[0];
from http://rndnext.blogspot.com/2009/05/using-nhibernate-multicriteria-and-linq.html