No generic method 'Contains' on type 'System.Linq.Enumerable'

Cenk 956 Reputation points
2023-03-21T13:22:40.4266667+00:00

Hi,

In my Blazor Server application, I am trying to filter a data grid. I am using the Radzen library. I want to add the Blazorise library (DatePicker) in order to select multiple dates. The problem is, DatePicker needs IReadOnlyList but on the other hand, the Radzen Data filter wants IEnumerable.

I used selectedDates.AsEnumerable() but I am getting this error. How can I fix this?

System.InvalidOperationException: No generic method 'Contains' on type 'System.Linq.Enumerable' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic.


<RadzenDataFilter @ref="dataFilter" Auto="auto" Data="@_orders" TItem="ReportViewModel" ViewChanged="@(view => filteredOrders = view.ToList())"
                      FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive">
        <Properties>
            
            <RadzenDataFilterProperty TItem="ReportViewModel" Property="OrderDateTime" Title="Order Date" FormatString="{0:d}" FilterValue="@selectedDates.AsEnumerable()" 
                                      Type="typeof(IEnumerable<DateTime?>)"
                                      FilterOperator="FilterOperator.Contains">
                <FilterTemplate>
                    <DatePicker @bind-Dates="selectedDates" TValue="DateTime?" InputMode="DateInputMode.Date" SelectionMode="DateInputSelectionMode.Multiple" 
                                DisplayFormat="dd/MM/Y" Placeholder="DD/MM/YYYY" />
                </FilterTemplate>
            </RadzenDataFilterProperty>
            
        </Properties>
    </RadzenDataFilter>

@code {
    RadzenDataFilter<ReportViewModel> dataFilter;
    IEnumerable<ReportViewModel> _orders;
    IEnumerable<ReportViewModel> filteredOrders;
    IQueryable<ReportViewModel?> query;
    IReadOnlyList<DateTime?> selectedDates = new List<DateTime?>().AsReadOnly();
ASP.NET Core
ASP.NET Core
A set of technologies in the .NET Framework for building web applications and XML web services.
4,157 questions
Blazor
Blazor
A free and open-source web framework that enables developers to create web apps using C# and HTML being developed by Microsoft.
1,385 questions
C#
C#
An object-oriented and type-safe programming language that has its roots in the C family of languages and includes support for component-oriented programming.
10,234 questions
0 comments No comments
{count} votes

2 answers

Sort by: Most helpful
  1. Sedat SALMAN 13,080 Reputation points
    2023-03-23T20:52:59.7833333+00:00

    The issue you are facing is due to the incompatibility between the Contains LINQ method and the IEnumerable<DateTime?> data type. Instead of using Contains, you can define a custom filter method for your RadzenDataFilterProperty.

    First, create a custom filter method FilterByDates in your @code block:

    
    bool FilterByDates(ReportViewModel report)
    {
        if (selectedDates == null || !selectedDates.Any())
        {
            return true;
        }
    
        return selectedDates.Contains(report.OrderDateTime);
    }
    
    

    Then, modify your RadzenDataFilterProperty to use this custom filter method:

    
    <RadzenDataFilterProperty TItem="ReportViewModel" Property="OrderDateTime" Title="Order Date" FormatString="{0:d}" FilterValue="FilterByDates"
                              Type="typeof(Func<ReportViewModel, bool>)" FilterOperator="FilterOperator.Custom">
        <FilterTemplate>
            <DatePicker @bind-Dates="selectedDates" TValue="DateTime?" InputMode="DateInputMode.Date" SelectionMode="DateInputSelectionMode.Multiple"
                        DisplayFormat="dd/MM/Y" Placeholder="DD/MM/YYYY" />
        </FilterTemplate>
    </RadzenDataFilterProperty>
    
    

    By using a custom filter method, you can perform filtering based on the selected dates without running into the Contains method compatibility issue.

    0 comments No comments

  2. Cenk 956 Reputation points
    2023-03-24T06:14:11.85+00:00

    This works for me;

    <RadzenCard class="mb-3">
        <RadzenDataFilter @ref="dataFilter" Auto="auto" Data="@_orders" TItem="ReportViewModel" ViewChanged="@(view => filteredOrders = view.ToList())"
                          FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive">
            <Properties>
                
                <RadzenDataFilterProperty TItem="ReportViewModel" Property="OrderDateTime" Title="Order Date" FormatString="{0:d}" 
                                          FilterValue="@filteredDates"
                                          Type="typeof(IEnumerable<DateTime>)"
                                          FilterOperator="FilterOperator.Contains">
                    <FilterTemplate>
                        <DatePicker Dates="selectedDates" TValue="DateTime" InputMode="DateInputMode.Date" SelectionMode="DateInputSelectionMode.Multiple"
                                    DisplayFormat="dd/MM/Y" Placeholder="DD/MM/YYYY" DatesChanged="@OnDatesChanged" />
                    </FilterTemplate>
                </RadzenDataFilterProperty>
                
            </Properties>
        </RadzenDataFilter>
    
    @code {
        RadzenDataFilter<ReportViewModel> dataFilter;
        IEnumerable<ReportViewModel> filteredOrders;
        bool auto = true;
        
        IReadOnlyList<DateTime> selectedDates = new List<DateTime>().AsReadOnly();
        IEnumerable<DateTime> filteredDates;
        
        Task OnDatesChanged(IReadOnlyList<DateTime> values)
        {
            filteredDates = values.Cast<DateTime>();
            return Task.CompletedTask;
        }
    }
    
    0 comments No comments