по крайней мере, один объект должен реализовать icomparable. по убыванию C # - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь упорядочить список пользовательских объектов по свойству вложенного объекта updatedDate, но выдает ошибку. Я хочу заказать список магазинов на основе вложенного свойства поля PartsInformation.updatedDate, а затем PartsDetail.updatedDate. Если вам нужно больше деталей, дайте мне знать, и я постараюсь обновить его. Я попробовал с Icomparable, но я новичок в этом, поэтому я не продолжил.

Структура класса:

public class StoreHomeInfo
{
    public string StoreID { get; set; }
    public string StoreName { get; set; }
    public List<OperationalUnit> OperationalUnitData { get; set; }
}

public class OperationalUnit
{      
    public string OunitID { get; set; }
    public string OunitName { get; set; }
    public List<PartsInformation> PartData { get; set; }
    public List<PartsDetail> PartCost { get; set; }
}

public class PartsInformation
{
    public string PartID { get; set; }
    public string Partname { get; set; }
    public string Summary { get; set; }       
    public string StoreID { get; set; }
    public string OunitID { get; set; }        
    public DateTime? updatedDate { get; set; }
}

public class PartsDetail
{
    public string PartsDetailID { get; set; }
    public string PartDetailName { get; set; }
    public string Summary { get; set; }
    public string OunitID { get; set; }
    public string StoreID { get; set; }      
    public DateTime? updatedDate { get; set; }       
}

Пример запроса:

var result = (from st in lstobjStoreDetails
                group st by new { st.ID, st.Storename } into grouped
                    select new StoreHomeInfo()
                    {
                        StorID = grouped.Key.ID, 
                        StoreName = grouped.Key.Storename,
                        OperationalUnitData = (from ser in lstobjOpUnitDetails
                            where ser.StorID.Equals(grouped.Key.ID)
                            group ser by new { ser.ID, ser.Ounitname } into 
                            grouped1
                            select new OperationalUnit()
                            {
                                OunitID = grouped1.Key.ID,
                                OunitName = grouped1.Key.Ounitname,
                                PartsInformation = (from projes in lstobjpartDetails
                                      where projes.OunitID.Equals(grouped1.Key.ID)
                                      group serviceBS by new { projes.PartID, projes.Partname, projes.StorID, projes.OunitID,projes.updatedDate } into groupedparts
                                      select new PartsInformation()
                                      {
                                           PartID = lstobjpartDetails.Where(q => q.StorID == grouped.Key.ID && q.OunitID == grouped1.Key.ID && q.PartID ==  groupedparts.Key.PartID).FirstOrDefault() != null ? lstobjpartDetails.Where(q =>  q.StorID == grouped.Key.ID && q.OunitID == grouped1.Key._ID && q.PartID ==  groupedparts.Key.PartID).FirstOrDefault().PartID : null,
                                           Partname = groupedparts.Key.Partname,
                                           Summary = groupedparts.Key.Summary,
                                           OunitID = grouped1.Key.ID,
                                           StorID = grouped.Key.ID,
                                           updatedDate = Convert.ToDateTime(groupedparts.Key.updatedDate)
                                      }).ToList(),
                                PartCost = (from pes in lstobjpartCostDetails
                                            where pes.OunitID.Equals(grouped1.Key._ID)
                                            group serviceBS by new { pes.PartsDetailID, pes.PartDetailName, pes.OunitID, pes.Summary pes.updatedDate, pes.StorID} into grouped2
                                            select new PartsDetail()
                                            {
                                                PartsDetailID = lstobjpartCostDetails.Where(q => q.StorID == grouped.Key._ID && q.OunitID == grouped1.Key._ID && q.PartsDetailID == grouped2.Key.PartsDetailID).FirstOrDefault() != null ? lstobjpartCostDetails.Where(q => q.StorID == grouped.Key._ID && q.OunitID == grouped1.Key._ID && q.PartsDetailID == grouped2.Key.PartsDetailID).FirstOrDefault().PartsDetailID : null,
                                                PartDetailName = grouped2.Key.PartDetailName,
                                                Summary = grouped2.Key.Summary,
                                                StorID = grouped.Key.ID,
                                                OunitID = grouped1.Key.ID,
                                                updatedDate = Convert.ToDateTime(grouped2.Key.updatedDate)
                                            }).ToList()
                            }).ToList()
                    }).OrderByDescending(n => n.OperationalUnitData.OrderByDescending(p => p.PartCost != null && p.PartCost.Any() ? p.PartCost.OrderByDescending(q => q.updatedDate) : null)
                          .ThenBy(x => x.PartsInformation != null && x.PartsInformation.Any() ? x.PartsInformation.OrderByDescending(y => y.updatedDate) : null)).ToList();

1 Ответ

0 голосов
/ 19 июня 2019

Эта часть кода:

.OrderByDescending(p => p.PartCost != null && p.PartCost.Any() ? p.PartCost.OrderByDescending(q => q.updatedDate) : null)

пытается упорядочить список OperationalUnit s, но ключ, по которому вы упорядочиваете, - List<PartCost>.Я подозреваю, что вы хотите, чтобы член из этого списка упорядочил по.

Кроме того, вы пытаетесь проделать большую работу в одну строку, и ваш код будет намного понятнее, еслиВы разделили методы, чтобы войти в вызовы OrderByDescending.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...