Benötigen Sie Hilfe bei LINQ Lambda-Expression auf die Entwicklung auf einem Zeitplan filtern
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.
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.