我对第三方物流的知识不是很了解。可能我误解了一些要点。我有一个对实体的链接查询和一个连接操作符,我用它来连接不同的数据库集和不同的实体。结果列表包含内部连接选择。下面是:
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。谢谢。
2条答案
按热度按时间lymgl2op1#
你犯了一个很大的错误,到处放
ToList/Async
。LINQ查询在你最后物化对象时是有效的。我不知道你为什么不使用它的值就放join,然后放GroupBy
来删除重复项,但是这个查询会比原始问题更有效:xdnvmnnf2#
您的查询有几个问题。首先,分组看起来完全没有必要,在最坏的情况下,您可能需要使用
Distinct
来避免重复,但这也可能是可以避免的。GroupBy
通常用于您想要聚合数据的地方,例如获取计数、最小值或最大值。或者只是按明细对相关记录进行分组。下一个问题是,您已经将该方法声明为async
,但是查询的大部分是同步的(ToList
,而不是ToListAsync
),而且在只为视图模型投影您关心的值之前,您将获取数据的整个分组聚合集。(在Select
之前执行ToList
)假设Plant和SapTransfer表不共享FK关系,则联接此表实际上只是过滤在SapTransfer表中具有匹配记录的Plant。如果这是预期行为,则可以尝试以下操作: