【问题标题】:NHibernate - Equivalent of CountDistinct projection using LINQNHibernate - 等效于使用 LINQ 的 CountDistinct 投影
【发布时间】:2009-08-11 16:11:08
【问题描述】:

我正在尝试使用新的 LINQ 提供程序将用于多字段搜索页面的条件查询替换为 LINQ 查询。但是,我在获取记录计数时遇到了问题,以便我可以实现分页。我正在努力取得成果 等效于使用 LINQ 从 Criteria API 的 CountDistinct 投影产生的投影。有没有办法做到这一点?

LINQ 提供的 Distinct() 方法似乎不像我预期的那样运行,并将“.Distinct().Count()”附加到按字段分组的 LINQ 查询的末尾,我想要一个不同的字段count of (an integer ID column) 似乎返回这些值的非不同计数。

如果需要,我可以提供我正在使用的代码,但是由于字段太多,所以 很长,所以如果不需要的话,我不想把帖子挤满。

谢谢!

【问题讨论】:

    标签: c# linq nhibernate


    【解决方案1】:

    我想出了一种方法来做到这一点,尽管它可能不是在所有情况下都是最佳的。实际上,在不使用 .Count() 的情况下,对 LINQ 查询执行 .Distinct() 确实会在结果 SQL 查询中产生“不同”。如果我通过使用 .Distinct().ToList() 来枚举查询,然后对生成的内存集合使用 .Count() 方法,我会得到我想要的结果。

    这并不完全等同于我最初对 Criteria 查询所做的操作,因为计数实际上是在应用程序代码中完成的,并且整个 ID 列表必须从 DB 发送到应用程序。不过,就我而言,鉴于不同 ID 的数量很少,我认为它会起作用,并且不会成为太大的性能瓶颈。

    不过,我确实希望将来会实现真正的 CountDistinct() LINQ 操作。

    【讨论】:

    • 我刚刚遇到了同样的问题。在我看来,这似乎是 LINQ 适配器生成错误 SQL 的问题。我也必须使用相同的解决方法,在对其执行 Count() 之前强制使用 ToList() 评估查询。
    【解决方案2】:

    您可以尝试先选择您想要明确计数的列。它看起来像:Select(p => p.id).Distinct().Count()。就目前而言,您正在区分整个对象,它将比较对象的引用而不是实际值。

    【讨论】:

    • 一个好主意,我试过了。不幸的是,这似乎不像我期望的那样工作。在我的情况下,表中实际上有 27 个不同的 ID,但是对我所有的连接执行此操作会返回 47,000。执行 .Distinct().Count() 生成的查询实际上并没有“不同”。希望在未来的版本中可以改变一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多