【问题标题】:C# / Blazor How to apply filter after get data from serverC# / Blazor 如何在从服务器获取数据后应用过滤器
【发布时间】:2021-05-14 06:13:59
【问题描述】:

我有一个项目的类/实体。

实体示例:

public class Project
{
    public int Id { get; set; }
    public string? ProjectId { get; set; }
    public string Name { get; set; }
}

在 Blazor 文件中,我有以下代码。 projList 从我的存储库中获取数据, filterList = projList 有效

@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();
        ..
    }

我在使用 .Contains 的上述指令中遇到错误。 我可以使用

(p => p.ProjectId == projFilter).ToList() 

但是当用户在文本框中编写过滤器并显示包含该输入字符串的项目时,我想在运行时过滤我的列表。

.Contains 如果我在从服务器读取数据时在我的存储库中使用它,但我不会在运行时使用它,因为它会给 SQL 服务器带来很多问题。

有什么问题吗?

我正在使用最新的 netcore 和 efcore 以及 Visual Studio 2019。

【问题讨论】:

  • 所以您想显示ProjectId 字符串包含子字符串projFilter 的任何项目?还是开始?

标签: c# asp.net blazor


【解决方案1】:

我根据您的问题发布了一段代码,可以随意更改以符合您的要求:

<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 条记录,此请求可能会影响性能)

查看此答案以了解 blazor 上的去抖动:https://stackoverflow.com/a/57545940/842935

【讨论】:

  • 感谢您的回答。但我仍然遇到同样的错误: System.NullReferenceException: 'Object reference not set to an instance of an object。 DataAccess.Data.Project.ProjectId.get 返回 null。
  • 难道我有一个公共虚拟 ICollection ProjDatas { get;放; } ?在我的课堂项目中?
  • 在您的代码中,ProjectId 可以为空。在比较之前检查它不为空:...ProjectId != null &amp;&amp; ...
猜你喜欢
  • 2018-03-06
  • 2021-08-15
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
相关资源
最近更新 更多