没有“ GroupID”列时进行分组(EF按多个列分组,页面,维护组代码)

时间:2019-03-15 17:22:38

标签: c# entity-framework-6 sql-server-2016

这并不是一件特别的事情,但是大多数人在知道我没有太多更改C#代码的能力的情况下试图找到一个好的解决方案。我目前有一个Grid(DataTables.net),它正在使用MVC和EF。对于其他所有功能,它都可以正常工作,但是我得到了新的信息,可能是我在SQL中有一个数据集,其中每行可能有也可能没有子行。
(还要注意,此示例使用Linqkit表示动态Where,使用Dynamic Linq NugetPackage表示OrderBy)

用户希望看到10件东西。因此,可能有10条记录或返回20条记录,但最多仍为(10组)。当前调用数据库的代码如下所示:

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

实际数据如下所示。饮料表 DrinksTable

GroupId确实不存在;它只是在此图中显示了关系。

但是要知道某行是否有孩子,唯一的方法是匹配“饮料类型”,“可用”,使用“振动筛”,“威士忌”和“可乐”。
杯子大小确定记录是否有子对象,而价格/盎司只是属性数据。

这就是问题所在。如何以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();

我无法将SelectMany()交给Maintian Groups,所以我最终选择了这条路线。它还没有完成,但是非常希望这会有所帮助。如果有人知道一种更有效的书写方式,请告诉我。再次感谢。

             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++;
            };

如果任何人都可以通过一种更清洁,更快捷的方式来执行此操作的任何部分,请将其发布。我全力以赴,但这解决了我的“按组选择,分页和维护唯一组ID”的问题。

0 个答案:

没有答案