Как использовать Where, Group By, Select и OrderBy в одном запросе linq? - PullRequest
1 голос
/ 09 февраля 2020

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

Исключение

enter image description here

Ответы [ 4 ]

1 голос
/ 09 февраля 2020

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

Итак, у вас есть последовательность Usar ios.

IQueryable<Usario> usarios = ...

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

Ваш первый шаг - выбросить немного Usar ios, используя Где : вы хотите оставить только usar ios с Perfil равным RoleType .Parceirdo:

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

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

Результатом является подмножество Usar ios, это последовательность Usar ios.

Из каждого 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 портит удовольствие

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

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

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

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

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

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

Требование

У меня есть последовательность Usar ios. Я только хочу сохранить эти Usar ios со значением Perfil равным RoleType.Parceirdo. Из оставшихся Usar ios я хочу использовать значения свойств 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();
1 голос
/ 09 февраля 2020

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

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();
1 голос
/ 09 февраля 2020

Допустим, 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();
1 голос
/ 09 февраля 2020

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

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

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

Более подробную информацию вы можете найти в этом разделе документа do c: * 1008. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...