2009-06-17 12 views
1

オブジェクト構造を正しくフィルタリングするためにリストを呼び出すラムダ式を見つけるのに苦労しています。私はここの誰かが助けてくれることを願っていました。私は.NET 3.5とLINQを使用しており、オブジェクトドメインはLinqからSQL DBMLに設定されています。私は特にラムダ式を使いたいと思っています。スケジュールでフィルタリングするLINQラムダ式を開発するのに助けが必要

オブジェクト構造は、人が設定を持つもので、1つの設定はStartDateとEnd Dateを持つ別のスケジュールクラスに対応するSchedule名です。

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

私は国家=「アクティブ」OR開始日と終了日の間、現在の日付を含むScheduleNameはとのある人を返しますラムダ式を作成することにより、人物のリストをフィルタリングします。言い換えれば、Jillはスケジュールされており、ScheduleBを使用しており、ScheduleBは2009年、今日は6/17/2009であるため、フィルタリングされたリストに表示されます。

私は、任意の助けを事前に

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

おかげで始めています。

答えて

1

情報の格納方法を再考する必要があります。 .NET CollectionnsはSQLテーブルではありません。そのように使用するべきではありません。言われていることを、ここにあなたが望んでいたクエリがあります:

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

ありがとう:あなたのようなデータ構造を持っていた場合

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

を想像してみてください。私はインフォメーションストアが不足しており、リファクタリングが必要であることに同意します。 (なぜラムダがこんなにかっこいいのですか?)BTW、私は昨年予定されていたBillを追加しましたが、彼はフィルターを通過しました。私は表現を修正できるかどうかを知らせます。 –

+0

私は&|の代わりに&&を持っていましたが、それはBillを拾ってはいけません。どのようなコードを使用していますか?あなたの初期化コードをコピーしてクエリを実行し、JillとJaneだけを返します。参照してください:http://pastebin.com/m2d726e3f – Jimmy

+0

ありがとうジミー、それは私が探していたeexactlyだった。 –

0

1つの問題は、Selectで始まることです。投影用です。フィルタリングしようとしているだけなので、Whereが必要です。

もう一つの問題は、あなたのMyPersonタイプがScheduleNameまたはStateプロパティが含まれていないことです。それがどうやって一緒にぶら下がっていくのかははっきりしていません。あなたの例を修正することができれば、私はフィルターを思いつくことができると確信しています。

関連する問題