LINQ - 如何使用distinct与order by?

时间:2014-06-02 19:11:01

标签: c# sql .net linq nhibernate

我想对此做一个截然不同的事情:

query = from acao in query
  join itemAuditoria in Session.Query<ItemAuditoria>() on acao.Id equals itemAuditoria.Acao.Id
  join auditoria in Session.Query<Auditoria>() on itemAuditoria.Auditoria.Id equals auditoria.Id
  join maquina in Session.Query<Maquina>() on auditoria.Maquina.Id equals maquina.Id
  orderby maquina.Nome, acao.Numero
  select acao;

但是,如果我尝试在查询的末尾添加一个独特的:

query = (from acao in query
  join itemAuditoria in Session.Query<ItemAuditoria>() on acao.Id equals itemAuditoria.Acao.Id
  join auditoria in Session.Query<Auditoria>() on itemAuditoria.Auditoria.Id equals auditoria.Id
  join maquina in Session.Query<Maquina>() on auditoria.Maquina.Id equals maquina.Id
  orderby maquina.Nome, acao.Numero
  select acao).Distinct();

然后我收到了这个错误:

  

如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中。

1 个答案:

答案 0 :(得分:0)

与OP的评论中的答案相比,不确定性能影响,但为了便于阅读,这可能是次要的!

query =
    (from distinctAcao in
        (from acao in query
        join itemAuditoria in Session.Query<ItemAuditoria>() on acao.Id equals itemAuditoria.Acao.Id
        join auditoria in Session.Query<Auditoria>() on itemAuditoria.Auditoria.Id equals auditoria.Id
        join maquina in Session.Query<Maquina>() on auditoria.Maquina.Id equals maquina.Id
        select acao).Distinct()
    orderby maquina.Nome, distinctAcao.Numero
    select distinctAcao);

编辑:

很抱歉忽略了它没有编译 - 它在我的头脑中做了;)在途中的更正!

因为我们在此处执行子查询,其结果是acao项目列表中没有Nome字段,我们离开后无法对其进行排序子查询。因此我们可以:

  1. 在子查询中排序,然后消除重复项。

    query=(
        from distinctAcao in (
            from acao in query
            join itemAuditoria in Session.Query<ItemAuditoria>() on acao.Id equals itemAuditoria.Acao.Id
            join auditoria in Session.Query<Auditoria>() on itemAuditoria.Auditoria.Id equals auditoria.Id
            join maquina in Session.Query<Maquina>() on auditoria.Maquina.Id equals maquina.Id
            orderby maquina.Nome,acao.Numero
            select acao
        ).Distinct()
        select distinctAcao
    );
    

    结果:已排序,唯一的acao列表

    缺点:首先排序,然后过滤可能会影响效果

  2. 从子查询返回一个更好的组合对象,它将从连接的表中公开新字段。

    query2=(
        from distinctMix in (
            from acao in query
            join itemAuditoria in Session.Query<ItemAuditoria>() on acao.Id equals itemAuditoria.Acao.Id
            join auditoria in Session.Query<Auditoria>() on itemAuditoria.Auditoria.Id equals auditoria.Id
            join maquina in Session.Query<Maquina>() on auditoria.Maquina.Id equals maquina.Id
            select new { Id=acao.Id,Numero=acao.Numero,NomeFromMaquina=maquina.Nome }
        ).Distinct()
        orderby distinctMix.NomeFromMaquina,distinctMix.Numero
        select distinctMix
    );
    

    结果快速排序,唯一(acao +更多)列表

    缺点:返回的对象与用于迭代query的原始acao的类型不同,因此分配query=from acao in query select new { /* something else than acao */ };赢得了&t工作(因此在此代码示例中为query2

  3. 使用OP的评论回答:)

  4. P.S。

    这次代码编译肯定 - https://ideone.com/mDRRle提供的测试代码:&gt;