Как мне использовать Where, Group By, Select и OrderBy в одном запросе linq?

Я пытаюсь сделать 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);
        }

исключение

введите описание изображения здесь

Всего 4 ответа


Ваша программа не делает то, что вы хотите. Увы, вы забыли сказать вам, что вы хотите, вы только показали нам, что вы не хотели. Нам придется угадать.

Итак, у вас есть последовательность Усарио.

IQueryable<Usario> usarios = ...

Мне не нужно знать, что такое Усарио, все, что мне нужно знать, - это то, что он обладает определенными свойствами.

Ваш первый шаг - выбросить некоторые Usarios, используя Where : вы хотите оставить только те usarios, которые имеют Perfil равный RoleType.Parceirdo:

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

в словах: из последовательности Usarios сохраняются только те Usarios, которые имеют Perfil, равный RoleTyoe.Parceirdo.

Результатом является подмножество 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,
    })

В словах: из каждого Usario, который был сохранен после вашего Where, возьмите Id, Nome и Email, чтобы создать одну новую ViewParceirosModel.

Результатом является последовательность ViewParceirosModels. Если вы добавите ToList (), вы можете назначить результат спискам переменных.

Однако ваша группа портит веселье

Я не знаю, что вы планировали делать, но ваш GroupBy изменяет вашу последовательность ViewParceirosModels на последовательность «групп ViewParceirosModels». Каждая ViewParceirosModel в одной группе имеет один и тот же Id, значение этого Id находится в ключе.

Поэтому, если после GroupBy у вас есть группа ViewParceirosModel с ключом == 1, то вы знаете, что каждый ViewParceirosModel в этой группе будет иметь Id, равный 1.

Аналогично, все ViewParceirosModel в группе с ключом 17 будут иметь Id, равный 17.

Я думаю, что Id - ваш первичный ключ, поэтому в каждой группе будет только один элемент. Группа 1 будет иметь одну-единственную ViewParceirosModel с Id == 1, а группа 17 будет иметь одну-единственную ViewParceirosModel с Id == 17.

Если Id уникален, то GroupBy бесполезен.

После GroupBy вы хотите заказать вашу последовательность моделей ViewParceiros в восходящем NomeParceiro.

требование

У меня есть последовательность Усарио. Я только хочу сохранить эти Usarios со значением Perfil равным RoleType.Parceirdo. Из оставшихся Usarios я хочу использовать значения свойств Id / Nome / Email для создания ViewParceirosModels. Оставшаяся последовательность ViewParceirosModels должна быть заказана NomeParceiro, а результат должен быть помещен в список.

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

Когда вы создаете запрос LINQ с предложением group by, вы получаете сгруппированный запрос. Это своего рода словарь, который имеет в качестве ключа поле, которое вы выбрали для группировки, а в качестве значения - список записей этой группы.

Таким образом, вы не можете заказать по «nomeParceiro», потому что это поле находится внутри группы.

Если вы подробно опишите, как вы ожидаете результат, я могу показать вам пример кода для этого.

Вы можете найти более подробную информацию в этом разделе документа: https://docs.microsoft.com/pt-br/dotnet/csharp/linq/group-query-results


Допустим, ViewParceirosModel выглядит

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

После этого вы можете Groupby затем выбрать объединить с Orderby как 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();

Вы можете использовать следующий код.

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

Есть идеи?

10000