Besoin d'aide pour développer l'expression LINQ Lambda à filtrer sur une planification

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

  •  06-07-2019
  •  | 
  •  

Question

J'ai du mal à trouver l'expression lambda à appeler dans une liste pour filtrer correctement une structure d'objet. J'espérais que quelqu'un ici pourrait aider. J'utilise .NET 3.5, et LINQ et le domaine d'objet est configuré de Linq à SQL DBML. Je souhaite spécifiquement utiliser les expressions lambda .

La structure d'objet est une structure dans laquelle les personnes ont des paramètres et un paramètre est un nom de planification, qui correspond à une autre classe de planification avec une date de début et une date de fin.

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

}

Les calendriers ont des dates de début et de fin et l'état d'une personne peut être actif ou planifié.

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

Je souhaite filtrer la liste des personnes en créant une expression lambda qui renvoie les personnes avec State = " Active " OU avec un nom de calendrier contenant une date actuelle entre la date de début et la date de fin. En d'autres termes, Jill devrait apparaître dans la liste filtrée puisqu'elle est planifiée et qu'elle utilise ScheduleB, et ScheduleB est pour 2009 et qu'il est aujourd'hui le 17/06/2009.

Je commence avec

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

Merci d'avance pour votre aide.

Était-ce utile?

La solution

Vous devez repenser la manière dont vous stockez les informations. Les .NET Collectionns ne sont pas des tables SQL et vous ne devriez pas les utiliser comme cela. Cela étant dit, voici la requête que vous vouliez:

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

Imaginez si vous aviez une structure de données telle que:

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

Autres conseils

Un problème est que vous commencez avec un sélectionnez . C'est pour la projection - vous essayez simplement de filtrer, vous n'avez donc besoin que de .

Un autre problème est que votre type MyPerson n'inclut pas de propriété ScheduleName ou State . Ce n'est vraiment pas clair comment tout est fait pour rester ensemble. Si vous pouviez corriger votre exemple, je suis sûr que nous pourrons proposer le filtre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top