Группировать по отсутствующему столбцу «GroupID» (EF Group по нескольким столбцам, Page, Ведение кода группы) - PullRequest
3 голосов
/ 15 марта 2019

Речь идет конкретно не об одной вещи, но большинство пытается найти хорошее решение, зная, что у меня нет возможности сильно менять код C #.В настоящее время у меня есть Grid (DataTables.net). Он использует MVC и EF.Для всего остального это работает просто отлично, но мне дали новый, вероятно, у меня есть набор данных в SQL, где каждая строка может иметь или не иметь дочернюю строку.
(Также обратите внимание, что в этом примере используется Linqkit для динамического Гдеи Dynamic Linq NugetPackage для OrderBy)

Пользователь хотел бы видеть 10 возвращенных вещей.Таким образом, может быть возвращено 10 записей или 20 записей, но все равно максимум (10 групп).Текущий код, который вызывает DB, выглядит следующим образом:

 var rslt = await _context.DrinksTable
        .AsExpandable()
        .Where(whereClause)
        .OrderBy(sortBy, sortDir)
        .Skip(skip)
        .Take(take)
        .ToListAsync();

Фактически данные выглядят следующим образом.DrinksTable DrinksTable

Идентификатор группы на самом деле не существует ;это просто показывает отношения на этой иллюстрации.

Но Единственный способ узнать, есть ли у строки дочерний элемент, - это сопоставить по типу напитка, Доступно, использовать шейкер, виски и колу.
Размер бокала определяет, есть ли у записи дочерний элемент или нети цена / унция это просто данные атрибута.

Так вот в чем проблема.как структурировать / запросить набор записей таким образом, чтобы код EF продолжал работать как есть?Я в тупике .. Начал создавать несколько просмотров, но не уверен, будет ли это работать.Мне нужно, чтобы пейджинг продолжал работать, как сейчас.Если я согласен принять 2, мне нужно вернуть 5 лучших записей.

Не уверен, куда идти с этим, после нескольких проходов не похоже, что он действительно работает, вот обновленный код

        var rslt = await _context.DrinksTable
        .AsExpandable()
        .Where(whereClause)
        .GroupBy(x => new { x.DrinkType, x.Available, x.UseShaker, x.Whiskey, x.Cola})
        .OrderBy("Key.DrinkType", sortDir)
        .Skip(skip)
        .Take(take)
        .SelectMany(x => x).ToListAsync();

Iне удалось получить SelectMany () для Maintian группы, поэтому я в конечном итоге пошел по этому пути.Это еще не завершено, но это довольно близкая надежда, что это помогает.Если кто-то знает более эффективный способ написать это, дайте мне знать.Еще раз спасибо.

             int take = 2;
            string sortBy = "Key.Whisky";
            string sortDir = "Asc";
            int skip = 0;

            var xx = db.DrinksTable;

            var rslt = db.DrinksTable
                .GroupBy(x => new {x.Whisky, x.Available, x.Cola, x.DrinkType, x.UseShaker})
                .OrderBy(sortBy, sortDir)
                .Skip(skip)
                .Take(take)
                .ToList();

И для сохранения группировок с уникальными значениями закончилась циклическая обработка и добавление уникального идентификатора.

        List<DrinksTableDTO> dtDTO = new List<DrinksTableDTO>();
            //ToDo Create List with Parent and children. 
            int uniqueGroupCode = 1; 
            foreach (var itm in rslt)
            {
                // Parent Level here
                var topLevel = itm.Key;                  
                foreach (var snd in itm)
                {
                    //ToDo Create children and add to list 
                    dtDTO.Add(new DrinksTableDTO
                    {
                       GroupId = uniqueGroupCode,
                       Whisky =  snd.Whisky,
                       Available = snd.Available,
                       Cola = snd.Cola,
                       DrinkType = snd.DrinkType,
                       GlassSize = snd.GlassSize,
                       UseShaker  = snd.UseShaker,
                       Id = snd.Id
                    });
                }
                uniqueGroupCode++;
            };

Если у кого-то есть более быстрый и быстрый способ выполнить любую часть этого, опубликуйте его.Я за это, но это решило мою проблему выбора по группам, подкачки и поддержания уникальных идентификаторов групп.

...