表格
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 的,我无法删除这个问题。
看起来
GetWorks
可能会返回 List
或 IEnumerable
。这里的问题是将所有这些数据加载到内存中可能会出现问题。本质上,该解决方案涉及将工作委托给数据库:使 GetWorks
返回 IQueryable
。这样,当您执行works.select(w => w.region).Distinct()
时,该操作将在数据库中执行。 works.select(w => w.region).Distinct()
也是如此。只有在 BlazorServer
工作才能实现这一目标。
如果您使用 Blazor-WASM,则需要公开服务
GetRegions
和 GetWorkers
。
奖励轨道:标准化数据库并创建
Region
模型。
我认为你的程序很慢,因为
GetWorks()
返回 List<Work>
。
请记住,在列表上使用 Linq,您将在计算机上完成所有工作。如果您使用实体框架,您可以尝试重构代码以公开 IQueryable
(即使这不是最佳实践)。
或者您可以使用过滤器调用 GetWorks
并将工作委托给数据库。
两点:
您可以通过传递过滤器值来限制数据存储生成的数据集吗?
如果您使用 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 超出范围之前,需要具体化数据库查询。