簡體   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