Skip to main content
All docs
V26.1
  • GridCustomDataSourceUniqueValuesOptions Class

    Namespace: DevExpress.Blazor

    Assembly: DevExpress.Blazor.Grid.v26.1.dll

    NuGet Package: DevExpress.Blazor

    Declaration

    public class GridCustomDataSourceUniqueValuesOptions :
        GridCustomDataSourceOptions

    Remarks

    If standard data binding modes do not meet specific business requirements, you can implement your own data provider. To do so, create a GridCustomDataSource descendant and assign it to the Grid or TreeList component’s Data property.

    The following code snippet implements a custom data provider’s GetUniqueValuesAsync method:

    View Example: Custom Data Source Binding using Entity Framework Core

    using DevExpress.Blazor;
    using DevExpress.Data.Filtering;
    using DevExpress.Data.Filtering.Helpers;
    using CustomDataSource.Models;
    using System.Collections;
    using System.Linq.Expressions;
    using DevExpress.Data.Linq;
    using DevExpress.Data.Linq.Helpers;
    using Microsoft.EntityFrameworkCore;
    
    namespace CustomDataSource.Services;
    
    public class OrdersDataSource : GridCustomDataSource, IDisposable {
        protected override Type DataItemType => typeof(Order);
        private readonly NorthwindContext _context;
        private bool _disposed = false;
    
        public OrdersDataSource(IDbContextFactory<NorthwindContext> contextFactory) {
            _context = contextFactory.CreateDbContext();
        } 
        // ...
        public override Task<object[]> GetUniqueValuesAsync(GridCustomDataSourceUniqueValuesOptions options, CancellationToken cancellationToken) {
            var filteredQuery = ApplyFiltering(options.FilterCriteria, _context.Orders);
            var lambda = GetTypedLambda(options.FieldName);
            return filteredQuery
                .Select(lambda)
                .Distinct()
                .OrderBy(x => x)
                .ToArrayAsync(cancellationToken);
        }
        // ...
        private static IQueryable<Order> ApplyFiltering(CriteriaOperator criteria, IQueryable<Order> queryableSource) {
            return !criteria.ReferenceEqualsNull()
                ? (IQueryable<Order>)queryableSource.AppendWhere(
                    new CriteriaToEFExpressionConverter(queryableSource.Provider.GetType()), criteria)
                : queryableSource;
        }
        // ...
        private static Expression<Func<Order, object>> GetTypedLambda(string fieldName) {
            var parameter = Expression.Parameter(typeof(Order));
            var property = Expression.Property(parameter, fieldName);
            var lambda = Expression.Lambda<Func<Order, object>>(Expression.Convert(property, typeof(object)), parameter);
            return lambda;
        }
        // ...
        public void Dispose() {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    
        protected virtual void Dispose(bool disposing) {
            if (!_disposed) {
                if (disposing) {
                    _context?.Dispose();
                }
                _disposed = true;
            }
        }
        // ...
    }
    

    Inheritance

    Object
    GridCustomDataSourceOptions
    GridCustomDataSourceUniqueValuesOptions
    See Also