Kendo UI Grid для расширения MVC GroupBy не работает должным образом - PullRequest
2 голосов
/ 24 мая 2019

У меня есть эти строки кода

if (descriptors != null && descriptors.Groups.Any() )
{
   source = source.GroupBy( descriptors.Groups );
}

Источник - список несгруппированных данных типа MyBigModel

Моя большая модель выглядит так

public class MyBigModel: MyBigBaseViewModel, IDynamicParameterListItemViewModel
{
    #region Properties
    public int ID { get; set; }
    public int UserID { get; set; }

    public int TrainingID { get; set; }

    public string TrainingName { get; set; }

    public string TrainingDescription { get; set; }

    public string TrainingType { get; set; }

    public string TimeZone { get; set; }
    public int? TimeZoneID { get; set; }

    public DateTime? StartDate { get; set; }

    public DateTime? EndDate { get; set; }

    public int? Duration { get; set; }

    public decimal? MaxP { get; set; }

    public decimal? AverageP { get; set; }

    public string UserDisplayName { get; set; }

    public string LoginName { get; set; }

    public string UserFirstName { get; set; }

    public string UserLastName { get; set; }

    public string UserEmail { get; set; }

    //public string BookingType { get; set; }

    //public string BookingStatus { get; set; }

    public DateTime? BookingDate { get; set; }

    public DateTime? CancellationDate { get; set; }

    public string UserBookingModifiedBy { get; set; }

    public string UserBookingModifiedByType { get; set; }

    public string CompanyName { get; set; }

    public string ExternalCustomerNumber { get; set; }

    public string CustomerNumber { get; set; }

    public string ExternalCompanyNumber { get; set; }

    public string CompanyNumber { get; set; }

    public int? TrainingActivities { get; set; }

    public decimal? NetPrice { set; get; }

    public string NetPriceCurrency { set; get; }

    public int? CancellationPolicyDays { get; set; }

    public string ArticleNumber { set; get; }

    public string CostCenter { get; set; }

    public string PersonnelNumber { get; set; }

    public string OrderNumber { get; set; }

    public string InvoiceNumber { get; set; }
    public int TrainingSignatureID { get; set; }

    public int BookType { get; set; }
    public int BookStatus { get; set; }

    public string ParsedTrainingUserGroupsNames { get; set; }
    public string ParsedTrainingUserGroupsIDs { get; set; }

    public string DynamicParametersTrainings { get; set; }

    public string DynamicParametersUsers { get; set; }


    public string MatrixSignature
    {
        get
        {
            Dictionary<string, string> matrixDimensions = new Dictionary<string, string>();
            foreach (var dimension in MatrixSignatureDimensions)
            {
                List<MatrixDimensionLayerTreeViewModel> allConnectedLayers = dimension.Layers
                                                                                      .Flatten(l => l.Layers)
                                                                                      .Where(l => l.IsConnected)
                                                                                      .ToList();

                IEnumerable<string> connectedLayerNames = allConnectedLayers
                                                                            .Select(p => p.BaseLayer.Name)
                                                                            .OrderBy(p => p);

                if (allConnectedLayers.Any())
                {
                    matrixDimensions[dimension.BaseDimension.Name] = connectedLayerNames.StringJoin();
                }
            }
            return matrixDimensions.Select(x => string.Format("{0}: ({1})", x.Key, x.Value)).ToList().StringJoin(separator: ", ");
        }
    }

    public string BookingType
    {
        get
        {
            return
               ((TrainingBookingUserType)this.BookType).ToLabelTranslationTermString().TranslateForManagement();
        }
    }

    public string BookingStatus
    {
        get
        {
            return
                 ((TrainingBookingStatus)this.BookStatus).ToLabelTranslationTermString().TranslateForManagement();
        }
    }

    public string TrainingTypeID
    {
        get
        {
            return this.TrainingType.TranslateForManagement();
        }
    }
    public decimal? MaxPoints
    {
        get
        {
            return this.MaxP.HasValue ? Math.Round(this.MaxP.Value, 2) : (decimal?)null;
        }
    }
    public decimal? AveragePoints
    {
        get
        {
            return this.AverageP.HasValue ? Math.Round(this.AverageP.Value, 2) : (decimal?)null;
        }
    }

    public DateTime? TrainingStartDate
    {
        get
        {
            return this.StartDate.ToUserLocalTime(this.TimeZoneID);
        }
    }

    public DateTime? TrainingEndDate
    {
        get
        {
            return this.EndDate.ToUserLocalTime(this.TimeZoneID);
        }
    }

    public string DynamicParatemeterValues
    {
        get
        {
            if (string.IsNullOrEmpty(this.DynamicParametersTrainings) && string.IsNullOrEmpty(this.DynamicParametersUsers))
            {
                return string.Empty;
            }
            else
            {
                if (!string.IsNullOrEmpty(this.DynamicParametersTrainings) && !string.IsNullOrEmpty(this.DynamicParametersUsers))
                {
                    return string.Concat(this.DynamicParametersTrainings, this.DynamicParametersUsers);
                }
                else
                {
                    if (!string.IsNullOrEmpty(this.DynamicParametersTrainings))
                    {
                        return this.DynamicParametersTrainings;
                    }
                    else
                    {
                        return this.DynamicParametersUsers;
                    }
                }
            }
        }
    }

    public Dictionary<string, string> CustomFields { set; get; }

    //public Dictionary<string, string> ParsedCustomFields
    //{
    //    set { }
    //    get
    //    {
    //        return !String.IsNullOrEmpty(this.DynamicParatemeterValues) ? this.ExtractCustomFields(this.DynamicParatemeterValues) : null;
    //    }
    //}

    public string ParsedUserGroupsIDs
    {
        get
        {
            return this.ParsedTrainingUserGroupsIDs;
        }
    }

    public List<int> ResourceTrainingUserGroupIDs
    {
        get
        {
            return !String.IsNullOrEmpty(this.ParsedUserGroupsIDs) ? this.ParsedUserGroupsIDs.Split(',').Select(int.Parse).ToList() : null;
        }
    }

    public string ParsedUserGroupNames
    {
        get
        {
            return this.ParsedTrainingUserGroupsNames;
        }
    }

    public List<string> TrainingResourceUserGroups
    {
        set { }
        get
        {
            return !String.IsNullOrEmpty(this.ParsedUserGroupNames) ? this.ParsedUserGroupNames.Split(',').ToList() : null;
        }
    }

    public Dictionary<string, string> ParsedCustomFields
    {
        set { }
        get
        {
            return !String.IsNullOrEmpty(this.DynamicParatemeterValues) ? this.ExtractCustomFields(this.DynamicParatemeterValues) : null;
        }
    }

    // public Dictionary<string, string> CustomFields { get; set; }
    #endregion

    #region Matrix
    private List<MatrixDimensionTreeViewModel> MatrixSignatureDimensions
    {
        get
        {
            return MatrixCacheHelper.Current.GetSignatureDimensions(this.TrainingSignatureID, null, Modules.Trainings);
        }
    }
    #endregion

    #region Methods
    public Dictionary<string, string> ExtractCustomFields(string parameters)
    {
        if (string.IsNullOrEmpty(parameters))
        {
            return null;
        }
        Dictionary<string, string> dict = new Dictionary<string, string>();
        List<string> list1 = parameters.Split(new string[] { ",__NextParam_" }, StringSplitOptions.RemoveEmptyEntries).ToList();
        foreach (var str in list1)
        {
            string[] arr = str.Split(new string[] { "Val:" }, StringSplitOptions.RemoveEmptyEntries);
            if (arr.Length != 0)
            {
                dict.Add(arr[0].Trim(), arr[1]);
            }
        }

        return dict;
    }
    #endregion

    #region Constructor
    public MyBigModel()
        : base()
    {
        CustomFields = new Dictionary<string, string>();
    }
    #endregion
}

descriptors.Groups содержит 2 предмета.TrainingActivities и TrainingName с этим точным порядком и типа int? и string

Первый уровень группировки работает правильно, но на втором уровне группировки, после первой группы все подгруппыпусты

enter image description here

Во второй группе, согласно данным, должна быть другая подгруппа TrainingName с одним элементом.

Часы такие:

Несгруппированные данные:

enter image description here

Сгруппированные данные: enter image description here

GroupBy - это метод расширения Kendo для IQuerable, и кажется, что он не работает нормально.Любая подобная ситуация?Есть идеи, что может быть не так с моим кодом?

...