Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要帮助开发LINQ Lambda Expression以按计划进行筛选吗_C#_Linq_Lambda_Filtering - Fatal编程技术网

C# 需要帮助开发LINQ Lambda Expression以按计划进行筛选吗

C# 需要帮助开发LINQ Lambda Expression以按计划进行筛选吗,c#,linq,lambda,filtering,C#,Linq,Lambda,Filtering,我很难找到lambda表达式来调用列表以正确过滤对象结构。我希望这里有人能帮忙。我使用的是.NET3.5,LINQ和对象域是从LINQ到SQLDBML设置的。我特别想使用lambda表达式 对象结构是人员具有设置的结构,其中一个设置是计划名称,该名称对应于另一个具有开始日期和结束日期的计划类 public class MyPerson { public int ID { get; set; } public List<MySetting> Settings { get

我很难找到lambda表达式来调用列表以正确过滤对象结构。我希望这里有人能帮忙。我使用的是.NET3.5,LINQ和对象域是从LINQ到SQLDBML设置的。我特别想使用lambda表达式

对象结构是人员具有设置的结构,其中一个设置是计划名称,该名称对应于另一个具有开始日期和结束日期的计划类

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

}
公共类MyPerson
{
公共int ID{get;set;}
公共列表设置{get;set;}
}
公共类MySetting
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串值{get;set;}
}
公共类MySchedule
{
公共字符串ID{get;set;}
公共日期时间起始日期{get;set;}
公共日期时间结束日期{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);
List schedules=new List();
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”)};
附表。添加(附表A);
附表。添加(附表B);
列表设置jill=new List();
mysettingsetingfirstname=newmysetting{ID=1,Name=“FirstName”,Value=“Jill”};
mysettingsettingschedulename=newmysetting{ID=2,Name=“ScheduleName”,Value=“ScheduleB”};
mysettingstate=newmysetting{ID=3,Name=“State”,Value=“Scheduled”};//吉尔使用ScheduleB
settingsJill.Add(settingFirstName);
SettingsChill.Add(settingScheduleName);
SettingsChill.Add(设置状态);
List settingsBill=新列表();
settingFirstName=newmysetting{ID=1,Name=“FirstName”,Value=“Bill”};
settingScheduleName=new MySetting{ID=2,Name=“ScheduleName”,Value=“ScheduleA”};
settingState=newmysetting{ID=3,Name=“State”,Value=“Scheduled”};//比尔是去年预定的
settingsBill.Add(settingFirstName);
settingsBill.Add(settingScheduleName);
settingsBill.Add(settingState);
列表设置jane=新列表();
settingFirstName=newmysetting{ID=1,Name=“FirstName”,Value=“Jane”};
settingScheduleName=new MySetting{ID=2,Name=“ScheduleName”,Value=“ScheduleA”};
settingState=newmysetting{ID=3,Name=“State”,Value=“Active”};//简很活跃
settingsJane.Add(settingFirstName);
settingsJane.Add(settingScheduleName);
settingsJane.Add(settingState);
列表人员=新列表();
MyPerson Jane=new MyPerson{ID=1,Settings=settingsJane};
MyPerson Jill=newMyPerson{ID=2,Settings=settingsChill};
加上(简);
添加(吉尔);
增加(法案);
我想通过创建一个lambda表达式来过滤人员列表,该表达式将返回State=“Active”或ScheduleName(包含开始日期和结束日期之间的当前日期)的人员。换句话说,Jill应该出现在过滤列表中,因为她是计划的,她使用ScheduleB,ScheduleB是2009年的,今天是2009年6月17日

我从

List<MyPerson> filter = persons.Select (  // and this is where I get stuck.
List filter=persons。选择(//这就是我被卡住的地方。

提前感谢您的帮助。

一个问题是,您要从一个
选择开始。这是用于投影的-您只是在尝试筛选,所以您只需要
Where


另一个问题是你的
MyPerson
类型没有包含
ScheduleName
State
属性。真的不清楚这一切是如何联系在一起的。如果你能纠正你的例子,我肯定我们可以找到过滤器。

一个问题是你从
选择开始。这就是r投影-您只是在尝试过滤,所以只需要
Where


另一个问题是,您的
MyPerson
类型没有包含
ScheduleName
State
属性。实际上不清楚这些属性是如何联系在一起的。如果您能纠正您的示例,我相信我们可以找到筛选器。

您需要重新考虑如何存储信息..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; 
      })   
)
Persons.Where(person=>
person.Settings.Any(设置=>
(setting.Name==“State”&&setting.Value==“Active”))||
个人设置
.Where(setting=>setting.Name==“ScheduleName”)
.Any(设置=>{var sch=schedules
.First(schedule=>schedule.ID==setting.Value);
返回sch.StartDateDateTime.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
   )
)
class-Person{
词典设置;
列出时间表;
}
那么你的问题就是
person.Where(person=>
个人设置[“状态”]=“活动”||
Person.Schedules.Any(schedule=>
Datetime.Now>schedule.StartTime&&
DateTime.Now
您需要重新考虑如何存储信息。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; 
      })   
)
Persons.Where(person=>
person.Settings.Any(设置=>
(setting.Name==“State”&&setting.Value==“Active”))||
个人设置
.Where(setting=>setting.Name==“ScheduleName”)
.Any(设置=>{var sch=schedules
.First(schedule=>schedule.ID==setting.Value);
返回sch.StartDateDateTime.Now;
})   
)
想象一下,如果你有一个数据结构