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

Nhibernate计数不同(基于多个列)

牧信厚
2023-03-14
问题内容

基本上,我一直在尝试执行此操作(基于两列的计数不同):

select count(distinct(checksum(TableA.PropertyA, TableB.PropertyB))) 
from TableA 
left outer join TableB
on TableA.TableBId = TableB.Id 
where PropertyA like '%123%'

一直在搜寻如何执行此操作,但是没有运气。尝试过此方法,但从未真正起作用。根据两个表的两个属性,这并没有明显的不同:

var queryOver = c.QueryOver<TableA>();
TableB tableBAlias = null;
TableA tableAAlias = null;
ProjectionList projections = Projections.ProjectionList();

queryOver.AndRestrictionOn(x => x.PropertyA).IsLike("%123%");
projections.Add(Projections.CountDistinct(() => tableAAlias.PropertyA));

queryOver.JoinAlias(x => x.TableB , () => tableBAlias, JoinType.LeftOuterJoin);
projections.Add(Projections.CountDistinct(() => tableBAlias.PropertyB));

queryOver.Select(projections);
queryOver.UnderlyingCriteria.SetProjection(projections);
return queryOver.TransformUsing(Transformers.DistinctRootEntity).RowCount();

问题答案:

好的,这将采取一些步骤,请多多包涵。我在这里假设使用SQL Server,但说明应适用于支持checksum1的任何方言:

  1. 创建支持该checksum功能的自定义方言:

    public class MyCustomDialect : MsSql2008Dialect
    

    {
    public MyCustomDialect()
    {
    RegisterFunction(“checksum”, new SQLFunctionTemplate(NHibernateUtil.Int32, “checksum(?1, ?2)”));
    }
    }


  2. 更新配置以使用自定义方言(您可以在配置XML文件中或使用代码来执行此操作。有关更多信息,请参见此答案。这是我在现有配置代码中执行的操作:

    configuration
    .Configure(@"hibernate.cfg.xml")
    .DataBaseIntegration(
        db => db.Dialect<MyCustomDialect>());
    
  3. 创建一个调用的自定义投影checksum。此步骤是可选的-您可以根据需要Projections.SqlFunction直接调用,但是我认为将其重构为一个单独的函数更为简洁:

    public static class MyProjections
    

    {
    public static IProjection Checksum(params IProjection[] projections)
    {
    return Projections.SqlFunction(“checksum”, NHibernateUtil.Int32, projections);
    }
    }

  4. 编写您的QueryOver查询并调用自定义投影:

    int count = session.QueryOver<TableA>(() => tableAAlias)
    .Where(p => p.PropertyA.IsLike("%123%"))
    .Left.JoinQueryOver(p => p.TableB, () => tableBAlias)
    .Select(
        Projections.Count(
            Projections.Distinct(
            MyProjections.Checksum(
                Projections.Property(() => tableAAlias.PropertyA),
                Projections.Property(() => tableBAlias.PropertyB)))))
    .SingleOrDefault<int>();
    

这应该生成看起来像您所追求的SQL:

    SELECT count(distinct checksum(this_.PropertyA, tableba1_.PropertyB)) as y0_
FROM   [TableA] this_
    left outer join [TableB] tableba1_
    on this_.TableBId = tableba1_.Id
WHERE  this_.PropertyA like '%123%' /* @p0 */

1仍在尝试找出是否有一种方法可以在不手动指定参数数量的情况下映射函数



 类似资料:
  • 我会跟踪哪些人登录到我们的本地服务器,如下面的数据库所示。 我的数据库结构是:

  • 我有以下代码。。。 } ...如果我想返回与WHERE条件匹配的行的总数,这样做很好。 但是,我只想计算这3列中具有不同/唯一数据组合的记录:C_URI、C_BYTE_START_NUM和C_NUM_BYTES。 我知道我可以做一些像。。。 ...但是我希望在这种情况下有更有效的方法来执行不同的计数?? 为了增加清晰度,如果我的表中有这些数据… C_URI |C_BYTE_START_NUM |C

  • 我有一个以GridLayoutManager为布局管理员的recyclerview,我想要实现的是下图 正如你所看到的,每一行可能有多个项目,只是基于项目宽度,每个项目都是一个文本视图,具有宽度,但所有项目都有相同的高度。 我知道可以通过设置行跨度,但要做到这一点,我应该知道跨度的计数,而我的列表行将仅按项目宽度填充 有人能帮我吗?

  • 这看起来很容易,但却不知道该怎么做。当前数组数据是按日期和日期列出的,因此我需要将所有日期组合起来:天、月、6个月、1年。我需要将数组数据排列为下面的第二个数组。

  • 问题内容: 我如何使用JPA条件API执行以下操作: 使用CriteriaBuilder.countDistinct在一个列/路径上执行此操作很简单,但是如何在两个路径/列上执行此操作? 问题答案: 这是一个较晚的答案:-)尽管我不确定情况是否有所改变。 最近,我遇到了非常相同的需求,并使用concat解决了该需求,即通过将列连接为 伪列 ,然后将其连接到 伪列 上。 但是我不能使用,因为它生成了

  • 问题内容: 当我在where子句中对select中的同一表进行引用时,linq to Nhibernate会生成两个联接,一个用于select,一个用于where。IE 生成如下的SQL: 我本以为我应该更喜欢SQL: 有没有一种方法可以构造查询来实现这一点?有关系吗? 问题答案: 您是否尝试过比较SSMS中每个查询的查询执行计划?如果在SQL Server中消除了重复的联接,则没关系。我发现在某