Asp.net 在<;中键入并刷新建议;数据列表>;?

Asp.net 在<;中键入并刷新建议;数据列表>;?,asp.net,asp.net-core,blazor,Asp.net,Asp.net Core,Blazor,我正在建立一个带有建议的下拉输入。有数以百万计的建议。我想展示前50条建议。用户可以输入更多字符以缩小建议范围 如何使用Blazor(服务器端)实现它 @foreach(list.Where(x=>x.Name.StartWith(输入的值).Take(50))//列表中有数百万条记录,存储在数据库中。 { @b、 正文 } 类似这样的内容: @injectdbcontext DbContext;//您的EF DbContext可以访问您的数据 @foreach(filteredList中的变

我正在建立一个带有建议的下拉输入。有数以百万计的建议。我想展示前50条建议。用户可以输入更多字符以缩小建议范围

如何使用Blazor(服务器端)实现它


@foreach(list.Where(x=>x.Name.StartWith(输入的值).Take(50))//列表中有数百万条记录,存储在数据库中。
{
@b、 正文
}
类似这样的内容:

@injectdbcontext DbContext;//您的EF DbContext可以访问您的数据
@foreach(filteredList中的变量b)
{
@b、 正文
}
@代码{
输入值的私有字符串;
私有IEnumerable筛选器列表;
输入更改的专用异步任务(ChangeEventArgs e)
{
输入的值=e.作为字符串的值;
filteredList=wait dbContext.Data
.Where(x=>x.Name.StartWith(输入的值)
.Take(50)
.ToListAsync()
.配置等待(错误);
StateHasChanged();
}
}
如果要限制对数据库的请求数量,可以使用

//使用相同的html代码
@注入IServiceProvider;//获取提供程序实例
@代码{
私有CancellationTokenSource CancellationTokenSource;
输入值的私有字符串;
私有IEnumerable筛选器列表;
输入更改的专用任务(ChangeEventArgs e)
{
输入的值=e.作为字符串的值;
cancellationTokenSource?.Cancel();
cancellationTokenSource?.Dispose();
cancellationTokenSource=新的cancellationTokenSource();
var token=\u cancellationTokenSource.token;
返回任务。延迟(250,令牌)
.ContinueWith(异步任务=>
{
如果(task.IsCanceled)
{
返回;
}        
使用var scope=provider.CreateScope();
var context=scope.GetRequiredService();
filteredList=wait context.Data
.Where(x=>x.Name.StartWith(输入的值)
.Take(50)
.ToListAsync()
.配置等待(错误);
等待调用同步(StateHasChanged);
},TaskScheduler.Default);
}
}

返回语句是否与
等待Task.Delay(250,令牌);if(Task.IsCanceled)返回;filteredList=wait dbContext.Data….;wait InvokeAsync(StateHasChanged);
?而不是使用
.ContinueWith()
?@ca9163d9否,因为您无法检查任务是否已取消。但是您可以
尝试{…}catch(TaskCanceledException){}
@ca9163d9但您的评论指出必须删除
async
关键字,因此我更新了答案。我实现了解决方案。但是,在上一个操作完成之前,它将在该上下文上启动第二个操作,这将导致错误。这通常是由使用同一DbContex实例的不同线程引起的t、 有关如何避免线程问题的详细信息。Dbcontext作为
服务注入。AddDbContext(选项=>options.UseSqlServer(configuration.GetConnectionString(“MyDB”))、ServiceLifetime.Transient)
@ca9163d9是否忘了在某个地方“异步等待”某个内容?
<datalist id="suggestions">
    @foreach (var b in list.Where(x => x.Name.StartWith(theValueEntered).Take(50)) // list has millions records, which is stored in database.
    {
        <option value="@b.Value">@b.Text</option>
    }
</datalist>
<input autoComplete="on" list="suggestions" />