简体   繁体   English

LINQ-如何使用按顺序排序?

[英]LINQ - How to use distinct with order by?

I want to do a distinct on this: 我想对此做一个独特的:

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;

But if I try putting a distinct at the end of the query like this: 但是,如果我尝试像这样在查询的末尾放置一个不同的字符:

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();

then I get this error: 然后我得到这个错误:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified. 如果指定了SELECT DISTINCT,则ORDER BY项目必须出现在选择列表中。

Not sure about the performance impact compared to the answer in OP's comments, but this could be subqueried for readability! 与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);

edit: 编辑:

So sorry for overlooking that it didn't compile - it did in my head ;) Corrections on the way! 很抱歉忽略它未能编译-它在我脑海中造成了;)修正中!

Because we're doing subquery here, the result of which is a list of acao items which don't have a Nome field, we cannot sort by it after we leave the subquery. 因为我们在这里进行子查询,其结果是没有Nome字段的acao项列表,所以我们在离开子查询后无法对其进行排序。 Therefore we can either: 因此,我们可以:

  1. Sort inside subquery, then eliminate duplicates. 在子查询中排序,然后消除重复项。

     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 ); 

    Result: sorted, unique acao s list 结果:排序的,唯一的acao列表

    Cons: first sorting, then filtering might impact performance 缺点:先排序,然后过滤可能会影响性能

  2. Return a better, combined object from the subquery, which will expose new fields from joined tables. 从子查询返回一个更好的组合对象,该对象将显示联接表中的新字段。

     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 ); 

    Result: quickly sorted, unique ( acao +more) list 结果:快速排序,唯一( acao +更多)列表

    Cons: returned object will be of different type than original query that was used to iterate acao s, so assigning query=from acao in query select new { /* something else than acao */ }; 缺点:返回的对象将具有与用于迭代acao的原始query不同的类型,因此query=from acao in query select new { /* something else than acao */ };分配query=from acao in query select new { /* something else than acao */ }; won't work (hence query2 in this code example) 将不起作用(因此在此代码示例中为query2

  3. Use answer from OP's comments :) 使用OP评论中的答案:)

PS 聚苯乙烯

This time the code compiles for sure - test code available at https://ideone.com/mDRRle :> 这次代码可以肯定地编译-测试代码可从https://ideone.com/mDRRle获取 :>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM