繁体   English   中英

如何在同一个查询 linq 中使用 Where、Group By、Select 和 OrderBy?

[英]How do I to use Where, Group By, Select and OrderBy at same query linq?

我正在尝试同时使用 where、group by 和 select 来制作 linq,但我无法做到这一点,并且它总是抛出异常。

我怎么能行呢?

林克

public ActionResult getParceiros(){
            //return all partners
            IList<ViewParceirosModel> lista = new List<ViewParceirosModel>();
            lista = context.usuarios.Where(u => u.perfil == RoleType.Parceiro)
                                    .Select(x => new ViewParceirosModel
                                    {
                                        id = x.id,
                                        nomeParceiro = x.nome,
                                        emailAcesso = x.email
                                    })
                                    .GroupBy(x => x.id)
                                    .OrderBy(x => x.nomeParceiro)
                                    .ToList();



            return View(lista);
        }

例外

在此处输入图片说明

当您使用 group by 子句创建 LINQ 查询时,您会收到一个分组查询作为结果。 它是一种字典,将您选择分组的字段作为键,并将该组的记录列表作为值。

因此,您不能按“nomeParceiro”排序,因为该字段在组内。

如果您详细说明您对结果的期望,我可以向您展示一个代码示例。

您可以在文档的这一部分找到更多详细信息: https : //docs.microsoft.com/pt-br/dotnet/csharp/linq/group-query-results

您可以使用以下代码。

IList<ViewParceirosModel> lista = new List<ViewParceirosModel>();

lista = context.usuarios.Where(u => u.perfil == RoleType.Parceiro)
            .Select(x => new ViewParceirosModel
            {
                id = x.id,
                nomeParceiro = x.nome,
                emailAcesso = x.email
            })
            .OrderBy(x => x.nomeParceiro)
            .GroupBy(x => x.id)
            .ToList();

或者

 List<List<ViewParceirosModel>> listb = context.usuarios
            .Where(u => u.perfil == RoleType.Parceiro)
            .GroupBy(g => g.id).OrderBy(g => g.Key)
            .Select(g => g.OrderBy(x => x.nomeParceiro)).ToList();

假设ViewParceirosModel看起来像

public class ViewParceirosModel 
{
   public int id {get; set;}
   public List<string> nomeParceiro {get; set;}
   public List<string> emailAcesso {get; set;}
}

之后,您可以Groupby然后选择与Orderby结合,如下所示

IList<ViewParceirosModel> lista = new List<ViewParceirosModel>();

lista = context.usuarios.Where(u => u.perfil == RoleType.Parceiro)
        .Select(x => new ViewParceirosModel
        {
            id = x.id,
            nomeParceiro = x.nome,
            emailAcesso = x.email
        })
        .GroupBy(x => x.id)
        .Select(g => new ViewParceirosModel 
        { 
           id = g.Key, 
           nomeParceiro = g.Select(p => p.nomeParceiro).OrderBy(x => x.nomeParceiro).ToList()
           nomeParceiro = g.Select(p => p.emailAcesso).ToList()
         }) 
        .ToList();

你的程序没有做你想要的。 唉,你忘了告诉你你想要什么,你只向我们展示了你不想要的东西。 我们将不得不猜测。

所以你有一个 Usarios 序列。

IQueryable<Usario> usarios = ...

我不需要知道 Usario 是什么,我只需要知道它具有某些特性。

您的第一步是使用Where丢弃一些 Usarios:您只想保留 Perfil 等于 RoleType.Parceirdo 的 thos usarios:

// keep only the Usarios with the Perfil equal to RoleType.Parceirdo:
var result = usarios.Where(usario => usario.Perfil == RoleType.Parceirdo)

换句话说:从 Usarios 的序列中,只保留那些 Perfil 等于 RoleTyoe.Parceirdo 的 Usarios。

结果是 Usarios 的一个子集,它是 Usarios 的序列。

从这个结果中的每个 Usario 中,您想要选择一些属性并将它们放入一个 ViewParceirosModel 中:

var result = usarios.Where(usario => usario.Perfil == RoleType.Parceirdo)
    .Select(usario => new ViewParceirosModel
    {
        Id = x.id,
        NomeParceiro = x.nome,
        EmailAcesso = x.email,
    })

换句话说:从您的 Where 之后保留的每个 Usario 中,获取 Id、Nome 和电子邮件以创建一个新的 ViewParceirosModel。

结果是一系列 ViewParceirosModel。 如果添加 ToList(),则可以将结果分配给变量列表。

然而你的 GroupBy 破坏了乐趣

我不知道您打算做什么,但是您的 GroupBy,将您的 ViewParceirosModels 序列更改为“ViewParceirosModels 组”序列,一个组中的每个 ViewParceirosModel 都具有相同的 Id,此 Id 的值在 Key 中。

因此,如果在 GroupBy 之后您有一组 Key == 1 的 ViewParceirosModel,那么您就知道该组中的每个 ViewParceirosModel 的 Id 都等于 1。

类似地,具有 Key 17 的组中的所有 ViewParceirosModel 的 Id 将等于 17。

我认为 Id 是您的主键,因此每组中只有一个元素。 第 1 组将拥有唯一一个 Id == 1 的 ViewParceirosModel,第 17 组将拥有唯一一个 Id == 17 的 ViewParceirosModel。

如果 Id 是唯一的,则 GroupBy 是无用的。

在 GroupBy 之后,您希望按升序 NomeParceiro 对 ViewParceirosModels 序列进行排序。

要求

我有一个 Usarios 序列。 我只想保留那些 Perfil 值等于 RoleType.Parceirdo 的 Usarios。 从剩余的 Usarios 中,我想使用属性 Id / Nome / Email 的值来制作 ViewParceirosModels。 ViewParceirosModels 的剩余序列应由 NomeParceiro 排序,并将结果放入一个 List 中。

List<ViewParceirosModel> viewParceiroModels = Usarios
    .Where(usario => usario.Perfil == RoleType.Parceirdo)
    .Select(usario => new ViewParceirosModel
    {
        Id = x.id,
        NomeParceiro = x.nome,
        EmailAcesso = x.email,
    }
    .OrderBy(viewParceirosModel => viewParceirosModel.NomeParceiro)
    .ToList();

暂无
暂无

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

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