gpt4 book ai didi

c# - LINQ - 如何将 distinct 与 order by 一起使用?

转载 作者:太空宇宙 更新时间:2023-11-03 15:55:07 24 4
gpt4 key购买 nike

我想对此做一个不同的:

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

然后我得到这个错误:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

最佳答案

与 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+more)列表

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

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

附言

这次代码肯定可以编译 - 测试代码位于 https://ideone.com/mDRRle :>

关于c# - LINQ - 如何将 distinct 与 order by 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24001573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com