Benötigen Sie Hilfe bei LINQ Lambda-Expression auf die Entwicklung auf einem Zeitplan filtern

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich habe eine harte Zeit, um den Lambda-Ausdruck zu finden, auf einer Liste zu nennen korrekt eine Objektstruktur zu filtern. Ich hatte gehofft, hier jemand helfen könnte. Ich bin mit .NET 3.5 und LINQ und das Objekt Domäne von Linq to SQL DBML einrichten. Ich möchte speziell verwenden Lambda-Ausdrücke .

Die Objektstruktur ist ein, wo Personen Einstellungen haben, und eine Einstellung ist ein Zeitplan mit dem Namen, der mit einem Startdatum und Enddatum an einem anderen Zeitplan Klasse entspricht.

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; }

}

Schedules hat Start- und Enddatum, und eine Staat Person kann aktiv oder geplant werden.

    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);

Ich mag die Personen Liste filtern, indem Sie einen Lambda-Ausdruck erstellen, die Personen mit State = „aktiv“ oder mit einem ScheduleName zurückkehren wird ein aktuelles Datum zwischen dem Start- und Enddatum enthält. Mit anderen Worten, sollte Jill in der gefilterten Liste angezeigt werden, da sie geplant ist, und sie nutzt ScheduleB und ScheduleB ist für das Jahr 2009 und ist heute 2009.06.17.

Ich beginne mit

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

Vielen Dank im Voraus für jede Hilfe.

War es hilfreich?

Lösung

Sie müssen überdenken, wie Sie die Informationen werden zu speichern. .NET Collectionns sind nicht SQL-Tabellen, und Sie sollten sie nicht wie so verwenden. Dass gesagt wird, hier ist die Abfrage, die Sie wollten:

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; 
      })   
)

Stellen Sie sich vor, wenn Sie eine Datenstruktur wie gehabt:

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
   )
)

Andere Tipps

Ein Problem ist, dass Sie mit einem Select fangen. Das ist für die Projektion -. Sie nur zu filtern versuchen, so brauchen Sie nur Where

Ein weiteres Problem ist, dass Ihr MyPerson Typ enthält keine ScheduleName oder State Eigenschaft. Es ist wirklich nicht klar, wie es ist alles zusammen hängen gemeint. Wenn Sie Ihr Beispiel korrigieren könnte, ich bin sicher, dass wir mit dem Filter kommen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top