我想对此做一个截然不同的事情:
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项必须出现在选择列表中。
答案 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
字段,我们离开后无法对其进行排序子查询。因此我们可以:
在子查询中排序,然后消除重复项。
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
+更多)列表
缺点:返回的对象与用于迭代query
的原始acao
的类型不同,因此分配query=from acao in query select new { /* something else than acao */ };
赢得了&t工作(因此在此代码示例中为query2
)
使用OP的评论回答:)
这次代码编译肯定 - https://ideone.com/mDRRle提供的测试代码:&gt;