Как отфильтровать данные для PickList Radzen

Вопрос или проблема

Я работаю над проектом Blazor на стороне сервера, используя компонент RadzenPickList для отображения списка данных из моей таблицы People. Я хочу отфильтровать данные по CompanyId и TypeId перед отображением в PickList. Вот мой код ниже

<RadzenCard>
                <RadzenPickList @bind-Source="@Source" @bind-Target="@Target" Style="height:300px; width:100%;" Orientation="Orientation.Horizontal"
                                TextProperty="@nameof(ClassMembers.Name)" AllowFiltering="true" Multiple="true" ShowHeader="true" Disabled="false"
                                ButtonGap="12px" ButtonJustifyContent="JustifyContent.Center" ButtonStyle="ButtonStyle.Secondary" ButtonSize="ButtonSize.Medium"
                                ButtonShade="Shade.Default" ButtonVariant="Variant.Flat">
                    <SourceHeader>
                        Участник: 
                    </SourceHeader>
                    <TargetHeader>
                        Выбранный участник:
                    </TargetHeader>
                    <Template>
                        @context.Name
                    </Template>
                </RadzenPickList>
</RadzenCard>


@code 
{

private IEnumerable<People> Peoples;

private IEnumerable<People> _source;
private IEnumerable<People> Source
{
    get
    {
        return _source;
    }
    set
    {
        if (_source != value)
        {
            _source = value;

            // Console.WriteLine("Source обновлён);
        }
    }
}
private IEnumerable<People> _target;
private IEnumerable<People> Target
{
    get
    {
        return _target;
    }
    set
    {
        if (_target != value)
        {
            _target = value;
        }
    }
}
protected override async Task OnInitializedAsync()
{
    Peoples = await DbContext.People
    .Select(pl => new People
        {
            Id = pl.Id,
            Name = pl.Name,
            CompanyId = pl.CompanyId,
            TypeId = pl.TypeId
        }).ToListAsync() ?? new List<People>();

    Source = Peoples.Where(pl => pl.CompanyId == selectedCompany && pl.TypeId == selectedPeopleType).ToList();

    await base.OnInitializedAsync();
}
}

Я хочу отфильтровать коллекцию Peoples по CompanyId и TypeId. Однако отфильтрованные данные не отображаются. Я пробовал получить данные без фильтра, и они показывались нормально. Но когда я добавляю фильтрацию, данные не извлекаются. Кто-нибудь знает, что может быть не так?

Ответ или решение

Чтобы отфильтровать данные для компонента RadzenPickList в серверной части Blazor, вам необходимо убедиться, что значения selectedCompany и selectedPeopleType, которые вы используете для фильтрации, действительно содержат корректные идентификаторы. Если этих значений нет или они не совпадают с теми, что есть в базе данных, то результат фильтрации будет пустым.

Вот шаги, которые помогут решить вашу проблему и правильно настроить фильтрацию:

  1. Проверьте значения фильтров: Убедитесь, что selectedCompany и selectedPeopleType имеют правильные значения, соответствующие вашим данным в таблице People. Вы можете временно вывести их в лог или на экран для отладки, чтобы удостовериться в их корректности.

  2. Измените код фильтрации: Ваш код фильтрации может выглядеть корректным, но лучше добавить некоторую проверку перед выполнением фильтрации:

    Source = Peoples
       .Where(pl => pl.CompanyId == selectedCompany && pl.TypeId == selectedPeopleType)
       .ToList();
  3. Инициализация фильтров: Убедитесь, что selectedCompany и selectedPeopleType инициализируются до вызова фильтрации в OnInitializedAsync. Например:

    private readonly int selectedCompany = 1; // Пример значения
    private readonly int selectedPeopleType = 2; // Пример значения

    Если эти переменные устанавливаются динамически где-то в вашем коде, убедитесь, что они инициализируются перед использованием.

  4. Проверка наличия данных: После получения данных из базы данных, проверьте, есть ли там записанные значения для выбранных CompanyId и TypeId. Вы можете сделать это, например, перед фильтрацией:

    var filteredPeoples = Peoples
       .Where(pl => pl.CompanyId == selectedCompany && pl.TypeId == selectedPeopleType)
       .ToList();
    
    if(filteredPeoples.Any())
    {
       Source = filteredPeoples;
    }
    else
    {
       Source = Enumerable.Empty<People>(); // Если нет данных, следующие значения для Source будут пустыми.
    }
  5. Обновление компонента: После обновления Source не забудьте вызвать StateHasChanged(), чтобы обновить интерфейс:

    Source = filteredPeoples;
    StateHasChanged();

Вот полный пример из вашего кода с учетом упомянутых изменений:

protected override async Task OnInitializedAsync()
{
    Peoples = await DbContext.People
        .Select(pl => new People
        {
            Id = pl.Id,
            Name = pl.Name,
            CompanyId = pl.CompanyId,
            TypeId = pl.TypeId
        }).ToListAsync() ?? new List<People>();

    var filteredPeoples = Peoples
        .Where(pl => pl.CompanyId == selectedCompany && pl.TypeId == selectedPeopleType)
        .ToList();

    Source = filteredPeoples.Any() ? filteredPeoples : Enumerable.Empty<People>();

    await base.OnInitializedAsync();
}

Если вы выполнили все вышеописанные шаги и убедились, что значения фильтров корректны, а данные все еще не отображаются, то стоит проверить, нет ли проблем с самой базой данных или с ячейками данных выбранных идентификаторов.

Если у вас возникают дополнительные вопросы или есть ошибки, связанные с этой реализацией, сообщите об этом, и мы сможем глубже рассмотреть вашу проблему.

Оцените материал
Добавить комментарий

Капча загружается...