Radzen Dropdown 运行速度非常慢 [已关闭]

问题描述 投票:0回答:3

表格

Work
具有三列:
ID
Region
Worker

并且有两个下拉列表。

DropDown A:选择并过滤

Region
,与数据
region
绑定到
regions

DropDown B:选择并过滤

Worker
,与数据
worker
绑定到
workers

流程:用户选择region,然后选择该region的worker

初始化:

List<Work> works = new(); 
works = GetWorks(); //get all the records from the table
List<string> regions = new();
List<string> workers = new();
regions = works.Select(w=>w.region).Distinct().ToList();

当用户选择区域时

workers = works.Where(w=>w.Region == region).Select(w=>w.worker).Distinct().ToList();

Radzen 下拉菜单更新记录速度很慢。

更新: 这是 Radzen 的,我无法删除这个问题。

c# asp.net linq blazor
3个回答
1
投票

看起来

GetWorks
可能会返回
List
IEnumerable
。这里的问题是将所有这些数据加载到内存中可能会出现问题。本质上,该解决方案涉及将工作委托给数据库:使
GetWorks
返回
IQueryable
。这样,当您执行
works.select(w => w.region).Distinct()
时,该操作将在数据库中执行。
works.select(w => w.region).Distinct()
也是如此。只有在
BlazorServer
工作才能实现这一目标。

如果您使用 Blazor-WASM,则需要公开服务

GetRegions
GetWorkers

奖励轨道:标准化数据库并创建

Region
模型。


0
投票

我认为你的程序很慢,因为

GetWorks()
返回
List<Work>
。 请记住,在列表上使用 Linq,您将在计算机上完成所有工作。如果您使用实体框架,您可以尝试重构代码以公开
IQueryable
(即使这不是最佳实践)。 或者您可以使用过滤器调用
GetWorks
并将工作委托给数据库。


0
投票

两点:

您需要将过滤过程尽可能地推到数据管道中。

您可以通过传递过滤器值来限制数据存储生成的数据集吗?

如果您使用 API,您可以将区域和工作人员传递到 API 端点并获取过滤后的列表。 如果您使用数据库连接,您可以构造一个直接查询数据库的 EF 查询吗?

在这两种情况下,您都需要在管道中传递一个

Request
对象,并从数据管道中返回一个
Result
对象。请求对象包含您的查询参数,返回对象包含结果集、成功标志和失败时的错误消息。

仅实现一次

这实现了

regions
,即通过
work
进行枚举以产生单独的
List<Region>

var regions = works.Select(w=>w.region).Distinct().ToList();

然后您再次像这样枚举以构建您的选择。

@foreach(var region in regions)

您已经完成了相同的工作两次,并且分配了不需要的内存。

删除

.ToList()
并创建一个
IEnumerable<Region>
,一个定义查询的对象。直到您在控件中实际枚举它之后,它才会实现。

var regions = works.Select(w=>w.region).Distinct();

您需要在整个代码中应用这一原则。

请注意,数据管道将始终具体化一个列表。 API 调用将返回一个 json 对象,该对象将具体化为列表。在 DbContext 超出范围之前,需要具体化数据库查询。

© www.soinside.com 2019 - 2024. All rights reserved.