スケジュールでフィルタリングするためのLINQ Lambda式の開発に関するヘルプが必要
質問
リストを呼び出してオブジェクト構造を正しくフィルタリングするラムダ式を見つけるのに苦労しています。ここの誰かが助けてくれることを望んでいた。私は.NET 3.5を使用しており、LINQとオブジェクトドメインはLinqからSQL DBMLにセットアップされています。具体的には、ラムダ式を使用します。
オブジェクト構造は、個人が設定を持つ構造で、1つの設定はスケジュール名です。これは、開始日と終了日の別のスケジュールクラスに対応します。
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);
State =&quot; Active&quot;の人を返すラムダ式を作成して、人のリストをフィルタリングしたいまたは、開始日と終了日の間の現在の日付を含むScheduleNameを使用します。つまり、ジルはスケジュール済みであり、ScheduleBを使用していて、ScheduleBは2009年、今日は6/17/2009であるため、フィルターされたリストに表示されるはずです。
から始めています
List<MyPerson> filter = persons.Select ( // and this is where I get stuck.
ご協力ありがとうございます。
解決
情報の保存方法を再検討する必要があります。 .NET Collectionnは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
)
)
他のヒント
1つの問題は、 Select
から始めることです。それは投影のためです-あなたは単にフィルタリングしようとしているので、必要なのは Where
だけです。
もう1つの問題は、 MyPerson
タイプに ScheduleName
または State
プロパティが含まれていないことです。それがすべて一緒にハングアップすることを意味するのは本当に明確ではありません。あなたの例を修正することができれば、私たちはフィルターを思いつくことができると確信しています。