这并不是一件特别的事情,但是大多数人在知道我没有太多更改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();
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”的问题。