Linq to NHibernate实现DefaultIfEmpty

问题描述

LinqtoNHibernate没有实现DefaultIfEmpty,没有办法LeftJoin。我想自己实现,参考了其他方法和EF7,还是有点错误。不知道怎么处理了,有没有大神会呢。代码如下:publicclassProcessDefaultIfEmpty:IResultOperatorProcessor<DefaultIfEmptyResultOperator>{publicvoidProcess(DefaultIfEmptyResultOperatordefaultIfEmptyResultOperator,QueryModelVisitorentityQueryModelVisitor,IntermediateHqlTreetree){varqueryModel=entityQueryModelVisitor.Model;varfirstMethod=ReflectionHelper.GetMethodDefinition(()=>Queryable.DefaultIfEmpty<object>((IQueryable<object>)defaultIfEmptyResultOperator.GetConstantOptionalDefaultValue()));vartype=entityQueryModelVisitor.Model.SelectClause.Selector.Type;varparameter=Expression.Parameter(typeof(IQueryable<>).MakeGenericType(type),null);varcall=Expression.Call(firstMethod.MakeGenericMethod(type),parameter);varlambda=Expression.Lambda(call,parameter);tree.AddListTransformer(lambda);}}

解决方案

解决方案二:
EF7和NHibernate都是使用Remotiion.Linq来实现Linq功能的。EF实现代码如下:privatestaticExpressionHandleDefaultIfEmpty(EntityQueryModelVisitorentityQueryModelVisitor,DefaultIfEmptyResultOperatordefaultIfEmptyResultOperator,QueryModelqueryModel){if(defaultIfEmptyResultOperator.OptionalDefaultValue==null){returnExpression.Call(entityQueryModelVisitor.LinqOperatorProvider.DefaultIfEmpty.MakeGenericMethod(entityQueryModelVisitor.StreamedSequenceInfo.ResultItemType),entityQueryModelVisitor.Expression);}varoptionalDefaultValue=entityQueryModelVisitor.ReplaceClauseReferences(defaultIfEmptyResultOperator.OptionalDefaultValue,queryModel.MainFromClause);returnExpression.Call(entityQueryModelVisitor.LinqOperatorProvider.DefaultIfEmptyArg.MakeGenericMethod(entityQueryModelVisitor.StreamedSequenceInfo.ResultItemType),entityQueryModelVisitor.Expression,optionalDefaultValue);}

如上代码所示,EF7会返回一个表达式类型,而NH是向HQL树里追加表达式,现在问题就是出在表达式是什么类型,这一点NH和EF是不一样的。

时间: 2024-08-02 22:26:54

Linq to NHibernate实现DefaultIfEmpty的相关文章

用LINQ还是NHibernate?

感觉LinQ更轻量级. 两个都不是什么好东西-- 设计思路和发展方向都不一样. 好吃的就是好东西 Ivony兄对它们俩还是如此苦大仇深啊??呵呵----:) LINQ没用过,NHibernate用过一点,当业务逻辑很复杂的时候用起来感觉不方便. LINQ老实说实现模式有些诡异,复杂的应用很容易大幅提高SQL的复杂程度,而现在LINQ的内置SQL脚本生成逻辑基本上还是靠猜测和实验,如果每写一句复杂的LINQ,都要猜测核试验生成的SQL脚本,那LINQ的意义就大打折扣了. 我觉得还是尽量不要用不熟悉

艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例

    用ADO.NET操作数据库大家一定再熟悉不过了,select.insert.update等等SQL语句大家也都必然滚瓜烂熟.我将自己在学习LINQ to SQL过程中的动手经历记录下来,作为今后学习的参考,也希望对刚刚接触的人有一点帮助.     我在本文涉及到一个很简单的系统,利用DataGridView实现数据库数据的批量增.删.改,不是什么强大的功能.     如果有人感兴趣,可以在看完我的这篇文章之后用ADO.NET实现同样的功能,看看到底会比使用LINQ to SQL多多少时间

NHibernate之旅(1):开篇有益

本节内容 NHibernate是什么 NHibernate的架构 NHibernate资源 欢迎加入NHibernate中文社区 学习NHibernate有一段时间了,打算做个阶段性总结,就萌生了这个系列,这个系列参考NHibernate官方文档和Steve Bohlen的NHibernate之夏视频教程.作为开篇,首先了解多少人在使用NHibernate,先搞清楚NHibernate是什么?学习NHibernate的一些资源.也欢迎大家加入NHibernate中文社区. 这个系列我使用NHib

打造自己的LINQ Provider(中):IQueryable和IQueryProvider

概述 在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其强大 而优雅的编程方式赢得了开发人员的喜爱,而各种LINQ Provider更是满天飞, 如LINQ to NHibernate.LINQ to Google等,大有"一切皆LINQ"的 趋势.LINQ本身也提供了很好的扩展性,使得我们可以轻松的编写属于自己的 LINQ Provider. 本文为打造自己的LINQ Provider系列文章第二篇,主 要详细介绍自定义LINQ Provider中两个最重

打造自己的LINQ Provider(上):Expression Tree揭秘

概述 在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其强大 而优雅的编程方式赢得了开发人员的喜爱,而各种LINQ Provider更是满天飞, 如LINQ to NHibernate.LINQ to Google等,大有"一切皆LINQ"的 趋势.LINQ本身也提供了很好的扩展性,使得我们可以轻松的编写属于自己的 LINQ Provider. 本文为打造自己的LINQ Provider系列文章第一篇,主 要介绍表达式目录树(Expression Tree)

我的NHibernate之路(3)---表间多对多配置篇

本节要点: 1.如何配置表之间多对多的关系 2.多表之间如何进行操作 对于关系型数据库,表之间也多对多的关系也很常见的.在我们实际开发过 程中如何进行正确的映射的配置,以及所关联的表之间是如何操作的?这是本文 讲述的重点. 开发环境:VS2008 SP1 使用的NHibernate版本:NHibernate-2.1.2.GA- bin. 将上节讨论的学生表与班级表再进行深层次的引入:如果构建一个学生选课 的数据库,还需要什么表?表之间的关系如何对应?还是通过LINQ的截图说说表 的字段以及表之间

LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法

在本系列中,主要介绍LINQ to SQL基础的东西,因为LINQ太强大了,它对我 们平常使用不同的数据源有着不同的内容,其包括对于SQL Server 数据库的 LINQ to SQL:对于XML 文档的LINQ to XML:对于 ADO.NET 数据集的LINQ to DataSet:对于.NET 集合.文件.字符串等的LINQ to Objects.例外也出现了 一些对LINQ支持的开源项目,例如LINQ to JSON,LINQ for NHibernate等等. 在这个系列中,一些关

Linq扩展方法简单分析

在向大家详细介绍LINQ之前,首先让大家了解下LINQ是什么,然后全面介绍Linq扩展方法. LINQ使查询成为了.NET中头等的编程概念,被查询的数据可以是XML(LINQ to XML).Databases(LINQ to SQL.LINQ to Dataset.LINQ to Entities)和对象(LINQ to Objects).LINQ也是可扩展的,允许你建立自定义的LINQ数据提供者(比如:LINQ to Amazon.LINQ to NHibernate.LINQ to LDA

LINQ查询表达式基础描述

本文向大家介绍LINQ查询表达式,可能好多人还不了解LINQ查询表达式,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西. LINQ使查询成为了.NET中头等的编程概念,被查询的数据可以是XML(LINQ to XML).Databases(LINQ to SQL.LINQ to Dataset.LINQ to Entities)和对象(LINQ to Objects).LINQ也是可扩展的,允许你建立自定义的LINQ数据提供者(比如:LINQ to Amazon.LINQ to N