需要有关开发LINQ Lambda表达式以过滤计划的帮助
题
我很难找到要在列表上调用的lambda表达式来正确过滤对象结构。我希望有人可以提供帮助。我使用的是.NET 3.5,LINQ和对象域是从Linq到SQL DBML设置的。我特别想使用 lambda表达式。
对象结构是人员具有设置的对象结构,其中一个设置是计划名称,对应于具有StartDate和结束日期的另一个计划类。
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);
我想通过创建一个lambda表达式来过滤人员List,该表达式将返回State =&quot; Active&quot;或者包含ScheduleName,其中包含开始日期和结束日期之间的当前日期。换句话说,Jill应该出现在已过滤的列表中,因为她是Scheduled,她使用ScheduleB,ScheduleB是2009年,今天是6/17/2009。
我从
开始List<MyPerson> filter = persons.Select ( // and this is where I get stuck.
提前感谢您的帮助。
解决方案
您需要重新考虑如何存储信息。 .NET Collectionns不是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
)
)
其他提示
一个问题是你开始使用选择
。这是投影 - 你只是想过滤,所以你只需要 Where
。
另一个问题是您的 MyPerson
类型不包含 ScheduleName
或 State
属性。目前尚不清楚它是如何挂在一起的。如果你能纠正你的例子,我相信我们可以拿出过滤器。
不隶属于 StackOverflow