繁体   English   中英

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

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

我想对此做一个独特的:

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项目必须出现在选择列表中。

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

编辑:

很抱歉忽略它未能编译-它在我脑海中造成了;)修正中!

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

  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 +更多)列表

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

  3. 使用OP评论中的答案:)

聚苯乙烯

这次代码可以肯定地编译-测试代码可从https://ideone.com/mDRRle获取 :>

暂无
暂无

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

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