بحاجة إلى مساعدة في تطوير تعبير LINQ Lambda للتصفية وفقًا للجدول

StackOverflow https://stackoverflow.com/questions/1009203

  •  06-07-2019
  •  | 
  •  

سؤال

أواجه صعوبة في العثور على تعبير لامدا للاتصال بقائمة لتصفية بنية الكائن بشكل صحيح.كنت آمل أن يتمكن شخص ما هنا من المساعدة.أنا أستخدم .NET 3.5، وLINQ وتم إعداد مجال الكائن من Linq إلى SQL DBML.أريد على وجه التحديد استخدام تعبيرات لامدا.

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

public class MyPerson
{
    public int ID { get; set; }
    public List<MySetting> Settings { get; set; }
}

public class MySetting
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

public class MySchedule
{
    public string ID { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }

}

تحتوي الجداول على تواريخ البدء والانتهاء، ويمكن أن تكون حالة الشخص نشطة أو مجدولة.

    List<MySchedule> schedules = new List<MySchedule>();
    MySchedule scheduleA = new MySchedule { ID = "ScheduleA", StartDate = Convert.ToDateTime("1/1/2008"), EndDate = Convert.ToDateTime("12/31/2008") };
    MySchedule scheduleB = new MySchedule { ID = "ScheduleB", StartDate = Convert.ToDateTime("1/1/2009"), EndDate = Convert.ToDateTime("12/31/2009") };
    schedules.Add(scheduleA);
    schedules.Add(scheduleB);

    List<MySetting> settingsJill = new List<MySetting>();
    MySetting settingFirstName = new MySetting { ID = 1, Name = "FirstName", Value = "Jill" };
    MySetting settingScheduleName = new MySetting { ID = 2, Name = "ScheduleName", Value = "ScheduleB" };
    MySetting settingState = new MySetting { ID = 3, Name = "State", Value = "Scheduled" };  // Jill uses ScheduleB
    settingsJill.Add(settingFirstName);
    settingsJill.Add(settingScheduleName);
    settingsJill.Add(settingState);

    List<MySetting> settingsBill = new List<MySetting>();
    settingFirstName = new MySetting { ID = 1, Name = "FirstName", Value = "Bill" };
    settingScheduleName = new MySetting { ID = 2, Name = "ScheduleName", Value = "ScheduleA" };
    settingState = new MySetting { ID = 3, Name = "State", Value = "Scheduled" };              // Bill is Scheduled last year
    settingsBill.Add(settingFirstName);
    settingsBill.Add(settingScheduleName);
    settingsBill.Add(settingState);

    List<MySetting> settingsJane = new List<MySetting>();
    settingFirstName = new MySetting { ID = 1, Name = "FirstName", Value = "Jane" };
    settingScheduleName = new MySetting { ID = 2, Name = "ScheduleName", Value = "ScheduleA" };
    settingState = new MySetting { ID = 3, Name = "State", Value = "Active" };              // Jane is Active
    settingsJane.Add(settingFirstName);
    settingsJane.Add(settingScheduleName);
    settingsJane.Add(settingState);

    List<MyPerson> persons = new List<MyPerson>();
    MyPerson Jane = new MyPerson { ID = 1, Settings = settingsJane };
    MyPerson Jill = new MyPerson { ID = 2, Settings = settingsJill };
    persons.Add(Jane);
    persons.Add(Jill);
    persons.Add(Bill);

أريد تصفية قائمة الأشخاص عن طريق إنشاء تعبير لامدا الذي سيعيد الأشخاص ذوي الحالة = "نشط" أو مع اسم جدول يحتوي على تاريخ حالي بين تاريخ البدء وتاريخ الانتهاء.بمعنى آخر، يجب أن تظهر جيل في القائمة التي تمت تصفيتها نظرًا لأنها مجدولة، وتستخدم TableB، وScheduleB لعام 2009، واليوم هو 17/6/2009.

أنا أبدأ ب

List<MyPerson> filter = persons.Select (  // and this is where I get stuck.

شكرا مقدما على أي مساعدة.

هل كانت مفيدة؟

المحلول

تحتاج إلى إعادة التفكير في كيفية تخزين المعلومات.مجموعات .NET ليست جداول SQL، ويجب ألا تستخدمها بهذه الطريقة.ومع ذلك، إليك الاستعلام الذي أردته:

Persons.Where(person => 
  person.Settings.Any(setting=>
      (setting.Name == "State" && setting.Value=="Active")) ||
  person.Settings
      .Where(setting=> setting.Name == "ScheduleName")
      .Any(setting => { var sch = schedules
           .First(schedule=>schedule.ID == setting.Value);
           return sch.StartDate < DateTime.Now && sch.EndDate > DateTime.Now; 
      })   
)

تخيل لو كان لديك بنية بيانات مثل:

class Person { 
    Dictionary<string, string> Settings;
    List<MySchedule> Schedules;
}

then your query would be

Persons.Where(person =>
   Person.Settings["State"] == "Active" ||
   Person.Schedules.Any(schedule => 
       Datetime.Now > schedule.StartTime &&
       DateTime.Now < schedule.EndTime
   )
)

نصائح أخرى

إحدى المشاكل هي أنك تبدأ بـ Select.هذا بالنسبة للإسقاط - أنت فقط تحاول التصفية، لذلك تحتاج فقط Where.

مشكلة أخرى هي أن الخاص بك MyPerson النوع لا يتضمن أ ScheduleName أو State ملكية.ليس من الواضح حقًا كيف يُقصد من كل هذا أن يتماسك معًا.إذا كان بإمكانك تصحيح المثال الخاص بك، فأنا متأكد من أنه يمكننا التوصل إلى عامل التصفية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top