当前位置: 首页 > 面试题库 >

从SQL Union到NHibernate标准

呼延哲
2023-03-14
问题内容

有一种方法可以将此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