linq 联接到DbSet中的实体后,在调试模式下无法返回

wqsoz72f  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(177)

我对第三方物流的知识不是很了解。可能我误解了一些要点。我有一个对实体的链接查询和一个连接操作符,我用它来连接不同的数据库集和不同的实体。结果列表包含内部连接选择。下面是:

public async Task<List<PlantsViewModel>> GetPlants()
{
    var plants = _context.Plants
        .Join(await _context.Saptransfer.ToListAsync(), plant => plant.PlantNumber, sap => sap.Plant,
        (plant, sap) => new
        {
            plant.PlantNumber,
            plant.Plant,
            plant.PlantManager,
            plant.District,
            plant.Area
        }).GroupBy(x => new
        {
            x.PlantNumber,
            x.Plant,
            x.PlantManager,
            x.District,
            x.Area
        }).ToList();

    return plants.
        Select(p => new PlantsViewModel
        {
            PlantID = p.Key.PlantNumber,
            PlantName = p.Key.Plant,
            PlantSupervisor = p.Key.PlantManager,
            DistrictName = p.Key.District,
            RegionName = p.Key.Area
        }).OrderBy(p => p.PlantName).ToList();
}

首先,它消耗了大量的执行时间--非聚集索引是缺席的。但是主要的问题是--为什么断点在运行时不切换返回?也许有人会告诉我如何正确地进行linq-query。谢谢。

lymgl2op

lymgl2op1#

你犯了一个很大的错误,到处放ToList/Async。LINQ查询在你最后物化对象时是有效的。我不知道你为什么不使用它的值就放join,然后放GroupBy来删除重复项,但是这个查询会比原始问题更有效:

public Task<List<PlantsViewModel>> GetPlants()
{
    var plants = 
        from plant in _context.Plants
        join sap in _context.Saptransfer on sap.Plant equals plant.PlantNumber
        group plant by new {         
            plant.PlantNumber,
            plant.Plant,
            plant.PlantManager,
            plant.District,
            plant.Area
        } into g
        orderby g.Key.Plant
        select new PlantsViewModel
        {
            PlantID = g.Key.PlantNumber,
            PlantName = g.Key.Plant,
            PlantSupervisor = g.Key.PlantManager,
            DistrictName = g.Key.District,
            RegionName = g.Key.Area
        };

    return plants.ToListAsync();
}
xdnvmnnf

xdnvmnnf2#

您的查询有几个问题。首先,分组看起来完全没有必要,在最坏的情况下,您可能需要使用Distinct来避免重复,但这也可能是可以避免的。GroupBy通常用于您想要聚合数据的地方,例如获取计数、最小值或最大值。或者只是按明细对相关记录进行分组。下一个问题是,您已经将该方法声明为async,但是查询的大部分是同步的(ToList,而不是ToListAsync),而且在只为视图模型投影您关心的值之前,您将获取数据的整个分组聚合集。(在Select之前执行ToList
假设Plant和SapTransfer表不共享FK关系,则联接此表实际上只是过滤在SapTransfer表中具有匹配记录的Plant。如果这是预期行为,则可以尝试以下操作:

public async Task<List<PlantsViewModel>> GetPlants()
{
    var plants = _context.Plants
        .Join(_context.Saptransfer, plant => plant.PlantNumber, 
            sap => sap.Plant,
            (plant, sap) => new
            {
                plant.PlantNumber,
                plant.Plant,
                plant.PlantManager,
                plant.District,
                plant.Area
            }).OrderBy(p => p.Plant)
        .Select(p => new PlantsViewModel
        {
            PlantID = p.PlantNumber,
            PlantName = p.Plant,
            PlantSupervisor = p.PlantManager,
            DistrictName = p.District,
            RegionName = p.Area
        }).Distinct();

    return await plants.ToListAsync();
}

相关问题