[英]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
项列表,所以我们在离开子查询后无法对其进行排序。 因此,我们可以:
在子查询中排序,然后消除重复项。
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
列表
缺点:先排序,然后过滤可能会影响性能
从子查询返回一个更好的组合对象,该对象将显示联接表中的新字段。
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
)
使用OP评论中的答案:)
这次代码可以肯定地编译-测试代码可从https://ideone.com/mDRRle获取 :>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.