أمر معقد في لينق

لدي قائمة كائن DemoInfo مع قائمة كائن StatInfo في ذلك كما أدناه-:

public class DemoInfo
{
  public string name;
  public List stat;
  public string workLocation;
}

StatInfo مزيد من تحت الكائن

public class StatInfo
{
  public string contact;
  public DateTime createdDate;
  public string action;
}

أحتاج إلى قائمة Orderby من DemoInfo by createdDate

كيف يمكنني القيام بذلك في Linq؟

0
لماذا العلامة SQL من قبل النظام؟
وأضاف المؤلف Tim Schmelter, مصدر
نظرًا لأن stat هي قائمة ، هل تريد createdDate أن تستخدمها في الطلب؟
وأضاف المؤلف NetMage, مصدر

1 إجابة

مشكلتك هي لأنك لم تحصل على مواصفات مناسبة

أحتاج إلى طلب قائمة DemoInfo عن طريق createdDate

لا يمكنك فعل ذلك ، لأن DemoInfo لا يحتوي على CreatedDate . إذا كنت تفترض أن DemoInfo قد تم إنشاؤه في اليوم الذي حصلت فيه على StatInfo الأول ، فيمكنك استخدام أقدم StatInfo للطلب:

أحتاج إلى طلب تسلسل DemoInfo الخاص بي بترتيب تصاعدي حسب تاريخ الإنشاء ، والذي يتم تعريفه على أنه تاريخ أقدم StatInfo .

لا يزال هناك مشكلة في ذلك: ما هي CreatedDate الخاصة بـ DemoInfo بعد إزالة StatInfos الخاص بها؟ وإزالة أقدم StatInfo من DemoInfo مع العديد من StatInfos فجأة يتغير CreatedDate من DemoInfo </القانون>.

ولكن دعنا نفترض أن هذا ليس مشكلة بالنسبة لك ، وتريد أن DemoInfo آخر بدون أي StatInfo آخر في النتيجة (لأنهم سيحصلون على CreationDate في المستقبل ، عندما يحصل على أول StatInfo . سوف يكون استفسارك مثل:

var result = myDemoInfos.Select(demoInfo => new
    {
        DemoInfo = demoInfo,
       //if the demoInfo has a non-null stat and a non-empty stat
       //order it by ascending StatInfo.CreatedDate, and take the first
       //otherwise use DateTime.MaxValue (Created in far future)
        CreationDate = ( (demoInfo.stat != null) && (demoInfo.stat.Any()) ?
            demoInfo.Stat
                .Select(statInfo => createdDate)
                .OrderBy(createdDate => createdDate)
                .First() :            //you know there is a first, you just checked Any()
                DateTime.MaxValue,    //if there is no First, take far future
    })
    .OrderBy(item => item.CreationDate)
    .Select(item => item.DemoInfo);

هذا يمكن أن يكون أكثر ذكاء: ليس لديك لفرز جميع تاريخ الإنشاء ، تحتاج فقط إلى تاريخ الإنشاء مع أصغر TickCount:

TickCount = ( (demoInfo.stat != null) && (demoInfo.stat.Any()) ?
     demoInfo.stat.Select(statInfo => statInfo.createdDate.TickCount).Min() :
     DateTime.MaxValue.TickCount,

وفرز حسب تصاعدي تيككونت

0
وأضاف