일정에 따라 필터링하기 위해 LINQ Lambda Expression 개발에 도움이 필요합니다.

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

  •  06-07-2019
  •  | 
  •  

문제

객체 구조를 올바르게 필터링하기 위해 목록을 호출하기 위해 Lambda 표현을 찾는 데 어려움을 겪고 있습니다. 나는 여기 누군가가 도울 수 있기를 바랐다. .NET 3.5를 사용하고 LINQ를 사용하고 있으며 객체 도메인은 LINQ에서 SQL DBML로 설정됩니다. 나는 구체적으로 사용하고 싶다 람다 표현.

객체 구조는 사람이 설정이있는 곳이며, 하나의 설정은 일정 이름이며, 이는 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);

나는 State = "Active"를 반환하거나 시작 날짜와 종료 날짜 사이에 현재 날짜가 포함 된 스케줄 이름을 가진 Lambda 표현을 작성하여 사람 목록을 필터링하고 싶습니다. 다시 말해, Jill은 예약 된 이후로 필터링 된 목록에 나타나야하며 Scheduleb를 사용하며 Scheduleb는 2009 년이며 오늘은 2009 년 6 월 17 일입니다.

나는 시작하고있다

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

다른 팁

한 가지 문제는 a로 시작한다는 것입니다 Select. 그것은 프로젝션을위한 것입니다 - 당신은 단지 필터를 만들려고합니다. Where.

또 다른 문제는 당신의 것입니다 MyPerson 유형은 a를 포함하지 않습니다 ScheduleName 또는 State 재산. 그것이 어떻게 매달려야하는지는 확실하지 않습니다. 당신이 당신의 예를 수정할 수 있다면, 우리는 필터를 만들 수 있다고 확신합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top