有一种方法可以将此SQL语句转换为NHibernate条件?
(select b1.FieldA as Name, b1.FieldA as FullName from Sale b1 where b1.FieldA like '%john%' or b1.FieldA like '%john%' order by b1.Id desc)
union
(select b2.FieldC as Name, b2.FieldD as FullName from Sale b2 where b2.FieldC like '%john%' or b2.FieldD like '%john%' order by b2.Id desc)
union
(select c.FieldE as Name, c.FieldF as FullName from Client c where c.FieldE like '%john%' or c.FieldF like '%john%' order by c.Id desc)
我发现NHibernate不支持工会。
因此,我找到了两种解决方案。我会分别执行每个查询,而不是合并结果。这就像一个联合,但不是在数据库中执行,而是在内存中执行。
var b1 = Session.Query<Sale>()
.Where(x => x.FiledA.Contains(filter) || x.FiledB.Contains(filter))
.OrderBy(x => x.Id)
.GroupBy(x => new { x.FiledA, x.FiledB })
.Select(x => new Foo { FullName = x.Key.FiledA, Name = x.Key.FiledB })
.Take(30)
.ToList();
var b2 = Session.Query<Sale>()
.Where(x => x.FiledC.Contains(filter) || x.FiledD.Contains(filter))
.OrderBy(x => x.Id)
.GroupBy(x => new {x.FiledC, x.FiledD})
.Select(x => new Foo {FullName = x.Key.FiledC, Name = x.Key.FiledD})
.Take(30)
.ToList();
var c = Session.Query<Client>()
.Where(x => x.FiledE.Contains(filter) || x.FiledF.Contains(filter))
.OrderBy(x => x.Id)
.GroupBy(x => new { x.FiledE, x.FiledF })
.Select(x => new Foo { FullName = x.Key.FiledE, Name = x.Key.FiledF })
.Take(30)
.ToList();
return b1.Concat(b2)
.Concat(c)
.ToList()
.GroupBy(x => new { x.Name, x.FullName })
.Select(x => x.First())
.Take(30);
要么
var b1 = Session.CreateCriteria<Sale>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Distinct(Projections.Property("FiledA")), "Name")
.Add(Projections.Property("FiledB"), "FullName"))
.Add(Restrictions.Or(Restrictions.InsensitiveLike("FiledA", filter),
Restrictions.InsensitiveLike("FiledB", filter)))
.AddOrder(Order.Desc("Id"))
.SetMaxResults(30)
.SetResultTransformer(Transformers.AliasToBean<Foo>())
.List<Foo>();
var b2 = Session.CreateCriteria<Sale>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Distinct(Projections.Property("FiledC")), "Name")
.Add(Projections.Property("FiledD"), "FullName"))
.Add(Restrictions.Or(Restrictions.InsensitiveLike("FiledC", filter),
Restrictions.InsensitiveLike("FiledD", filter)))
.AddOrder(Order.Desc("Id"))
.SetMaxResults(30)
.SetResultTransformer(Transformers.AliasToBean<Foo>())
.List<Foo>();
var c = Session.CreateCriteria<Client>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Distinct(Projections.Property("FiledE")), "Name")
.Add(Projections.Property("FieldF"), "FullName"))
.Add(Restrictions.Or(Restrictions.InsensitiveLike("FiledE", filter),
Restrictions.InsensitiveLike("FieldF", filter)))
.AddOrder(Order.Desc("Id"))
.SetMaxResults(30)
.SetResultTransformer(Transformers.AliasToBean<Foo>())
.List<Foo>();
return b1.Concat(b2)
.Concat(c)
.ToList()
.GroupBy(x => new {x.FullName, x.Name})
.Select(x => x.First())
.Take(30);
NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库。Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具。NHibernate 从数据库底层来持久化你的.Net 对象到关系型数据库。 NHibernate 让开发者的代码仅仅和对象关联,NHibernat 自动产生 SQL 语句,并确保对象提交到正确的表和字段中去。 特性包括: Visu
本文向大家介绍nhibernate 流利的NHibernate映射,包括了nhibernate 流利的NHibernate映射的使用技巧和注意事项,需要的朋友参考一下 示例 该Fluent NHibernate是一个库,以帮助您在使用C#代码,而不是XML映射的实体映射。Fluent NHibernate使用,fluent pattern并且它基于约定来创建映射,它为Visual Studio工具
NHibernate Designer 是一个 Visual Studio 2010 的插件,用于实现 NHibernate 的可视化设计功能。
对nHibernate的封装。 特点 * 无XML映射文件 (*.hdm.xml) * 流畅接口 * 流程C#配置nHibernate * 流畅C#映射,甚至自动映射。 * 强类新映射,减少类新匹配错误 * 数据库的重构,变得更容易 Fluent nHibernate的取代C#文件 public class CatMap : ClassMap{ public CatMap() { Id(
Welcome to NHibernate NHibernate is a mature, open source object-relational mapper for the .NET framework. It is actively developed,fully featured and used in thousands of successful projects. The NHi
在.NET Framework 3.5中提供了LINQ 支持后,Linq的呼声一度很高,各种LINQ Provider更是满天飞。他能够将数据查询语句集成到编程语言中,以一种统一的方式操作各种数据源,减少数据访问的复杂性。而LINQ本身也提供了很 好的扩展性,使开发人员可以轻松地编写属于自己的LINQ Provider。 NHiberante Linq 1.0支持基于NHibernate Cont