linq - NHibernate.Linq 和 MultiCriteria

标签 linq nhibernate linq-to-nhibernate

任何人都知道使用 NHibernate.Linq 批处理 NHibernate 查询的方法,就像使用 MultiCriteria 和 ICriteria 对象一样?

使用 MultiCriteria,我可以创建如下内容:

var crit = session.CreateMultiCriteria()
                  .Add(session.CreateCriteria(typeof(Entity1)).Add(Restrictions.Eq("Property1","Value"))
                  .Add(session.CreateCriteria(typeof(Entity2)).Add(Restrictions.Eq("Property2","Value2"));               

var result = crit.List();
var list1 = (IList)result[0];
var list2 = (IList)result[1];

如果我用 Linq 调用替换 CreateCriteria 调用并得到如下内容,那就太好了:
var crit = session.CreateMultiCriteria()
                .Add(session.Linq<Entity1>().Where(x => x.Property1 == "Value1")
                .Add(session.Linq<Entity2>().Where(x => x.Property2 == "Value2");

var result = crit.List();
var list1 = (IList<Entity1>)result[0];
var list2 = (IList<Entity2>)result[1];

我们将 Linq API 用于大多数其他查询,并且在需要运行 MultiCriteria 查询时使用相同的 Linq 语法会很好。

谢谢。

最佳答案

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];

来自 http://rndnext.blogspot.com/2009/05/using-nhibernate-multicriteria-and-linq.html

关于linq - NHibernate.Linq 和 MultiCriteria,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/684696/

相关文章:

LINQ 是否可以通过 LINQ 表达式树获取没有返回类型的方法名称?

nhibernate映射: A collection with cascade ="all-delete-orphan" was no longer referenced

c# - Nhibernate 无法反序列化可序列化的属性

repository - 如何将 Linq2NHibernate 的 .Fetch 和 .ThenFetch 包装到我的抽象存储库中?

C# 转换问题 : from IEnumerable to custom type

c# - 如何使用c#计算文件系统中一个文件夹中相似名称文件的数量?

linq - 如何实现与 EF 和 NHibernate 一起使用的工作单元

c# - hibernate 。在同一 session 中创建后包为空

c# - 如何在linq中选择最大的字符串到nhibernate

linq - LINQ查询问题