我在一个项目上有一个类/实体。
实体的例子:
public class Project
{
public int Id { get; set; }
public string? ProjectId { get; set; }
public string Name { get; set; }
}
在Blazor文件中,我有以下代码。projList从我的存储库中获取数据,filterList = projList works
@code {
private IEnumerable<Project> projList { get; set; } = new List<Project>();
private List<Project> filterList { get; set; } = new List<Project>();
public string projFilter { get; set; } = string.Empty;
..
private async Task ApplyProjFilter()
{
..
filterList = projList.Where(p => p.ProjectId.Contains(projFilter)).ToList();
..
}
在上面的指令中,我得到了一个错误。我可以用
(p => p.ProjectId == projFilter).ToList()
但是当用户在文本框中写入过滤器并显示包含该输入字符串的项目时,我想在运行时过滤我的列表
。如果我从服务器读取数据时在我的存储库中使用它,则包含工作,但我不会在运行时使用它,因为它会导致SQL-server出现很多问题。
有什么问题吗?
我正在使用最新的netcore和efcore以及Visual Studio 2019。
我发布了一个基于您的问题的代码剪辑,可以自由更改它以符合您的要求:
<input type="text" @oninput="@( (e) => ApplyProjFilter(e) )">
<li>
@foreach(var p in filterList)
{
<li>@p.Name</li>
}
</li>
@code {
public class Project
{
public string Name { get; set; }
}
private IEnumerable<Project> projList { get; set; }
private List<Project> filterList { get; set; }
public string projFilter { get; set; } = string.Empty;
protected override void OnInitialized()
{
projList = new []
{
new Project{ Name = "pA"},
new Project{ Name = "pB"} //, ...
}.ToList();
filterList = projList.ToList();
}
private async Task ApplyProjFilter(ChangeEventArgs e)
{
projFilter = e.Value.ToString();
filterList = projList.Where(p => p.Name.Contains(projFilter)).ToList();
}
}
检查它运行在:https://blazorrepl.com/repl/QPOGluvA27eghIPO51
防反跳:
阅读"它会引起很多问题的SQL-server">我想,也许,你正在寻找debounce
在某些情况下,将所有远程数据获取到客户端并不是一个好主意(如果您有超过300到400条记录,此请求可能会降低性能)
看看这个答案,了解debounce on blazor: https://stackoverflow.com/a/57545940/842935