/// <summary>
        /// Gets the data using the specified <paramref name="args"/>.
        /// NOTE: Only root types are returned by this method!
        /// </summary>
        /// <param name="args">The args</param>
        /// <returns></returns>
        public override async Task <IFailable <IEnumerable> > GetDataAsync(DataGridPresenterArgs args)
        {
            // Create the result
            var result = new Failable <IEnumerable>();

            try
            {
                var queryable = GetDataQuery;

                // Get the data model type
                var dataModelType = PresenterMap.QueryMap.RootType;

                // If there is a date column...
                if (DataGridMap.DateColumn != null)
                {
                    // If there is an after date...
                    if (args.After != null)
                    {
                        // Add a where condition
                        queryable = CeidDiplomatikiHelpers.AddWhereCondition(queryable, dataModelType, ExpressionHelpers.CreatePropertyEqualityExpression(dataModelType, DataGridMap.DateColumn, args.After.Value.DateTime, NumericEqualityOperator.GreaterOrEqualThan));
                    }
                    // If there is a before date...
                    if (args.Before != null)
                    {
                        // Add a where condition
                        queryable = CeidDiplomatikiHelpers.AddWhereCondition(queryable, dataModelType, ExpressionHelpers.CreatePropertyEqualityExpression(dataModelType, DataGridMap.DateColumn, args.Before.Value.DateTime, NumericEqualityOperator.LessOrEqualThan));
                    }
                }

                // If there is a search value...
                if (!args.Search.IsNullOrEmpty())
                {
                    // If there are search column...
                    if (!DataGridMap.SearchColumns.IsNullOrEmpty())
                    {
                        var parameterExp          = Expression.Parameter(dataModelType, "x");
                        var methodCallExpressions = new List <MethodCallExpression>();

                        // For every search column...
                        foreach (var searchColumn in DataGridMap.SearchColumns)
                        {
                            var expr = CreateContainsExpression(parameterExp, dataModelType, searchColumn, args.Search);

                            methodCallExpressions.Add(expr);
                        }

                        Expression orExpression = null;
                        foreach (var expr in methodCallExpressions)
                        {
                            if (orExpression == null)
                            {
                                orExpression = expr;

                                continue;
                            }

                            orExpression = Expression.OrElse(orExpression, expr);
                        }

                        var lambda = Expression.Lambda(typeof(Func <,>).MakeGenericType(dataModelType, typeof(bool)), orExpression, parameterExp);

                        queryable = CeidDiplomatikiHelpers.AddWhereCondition(queryable, dataModelType, lambda);
                    }
                }

                // Add the order by condition
                queryable = CeidDiplomatikiHelpers.AddOrderByDescendinCondition(queryable, dataModelType, PrimaryKeyProperty);

                // Add the skip condition
                queryable = CeidDiplomatikiHelpers.AddSkipCondition(queryable, dataModelType, args.Page * args.PerPage);

                // Add the take condition
                queryable = CeidDiplomatikiHelpers.AddTakeCondition(queryable, dataModelType, args.PerPage);

                // Get the models
                var models = await CeidDiplomatikiHelpers.ExecuteToListAsync(queryable, dataModelType);

                // Set the data
                result.Result = models;
            }
            catch (Exception ex)
            {
                // If there was an error...
                result.ErrorMessage = ex.Message;
            }

            // Return the result
            return(result);
        }