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

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
已筛选集合的Linq表达式?_Linq_Entity Framework - Fatal编程技术网

已筛选集合的Linq表达式?

已筛选集合的Linq表达式?,linq,entity-framework,Linq,Entity Framework,我希望这对任何擅长Linq的人来说都是一个相当简单的问题。我正在努力为下面的内容找到正确的Linq表达式。我能够破解一些东西来获得结果,但我确信有一种合适且简单的Linq方法可以做到这一点,我只是还不够擅长Linq 我有一个通过实体框架访问的数据库。它有许多任务。每个任务都有一组时间段。时间段具有日期和员工属性 我想要的是能够获得某个员工和某个月的任务,以及同一个月和员工的每个任务的时间段 同样,任务本身没有月份或日期信息,但它们根据与每个任务相关联的时间段进行设置 非常简单,它看起来有点像这样

我希望这对任何擅长Linq的人来说都是一个相当简单的问题。我正在努力为下面的内容找到正确的Linq表达式。我能够破解一些东西来获得结果,但我确信有一种合适且简单的Linq方法可以做到这一点,我只是还不够擅长Linq

我有一个通过实体框架访问的数据库。它有许多任务。每个任务都有一组时间段。时间段具有日期和员工属性

我想要的是能够获得某个员工和某个月的任务,以及同一个月和员工的每个任务的时间段

同样,任务本身没有月份或日期信息,但它们根据与每个任务相关联的时间段进行设置

非常简单,它看起来有点像这样:

    public class Model //Simplified representation of the Entity Framework model
    {
        public List<Task> Tasks { get; set; }
    }

    public class Task
    {
        public int Id { get; set; }
        public List<TimeSegment> TimeSegments { get; set; }
        public Customer Customer { get; set; }
    }

    public class TimeSegment
    {
        public int Id { get; set; }
        public string Date { get; set; }
        public Employee Employee { get; set; }
    }

    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
List<TimeSegment> segments = (
    from segment in model.TimeSegments
    where segment.Date.Month == month
    where segment.Employee.Id == employeeId
    select segment).ToList();

List<Task> allTasks =
    segments.Select(s => s.Task).Distinct().ToList();
公共类模型//实体框架模型的简化表示
{
公共列表任务{get;set;}
}
公开课任务
{
公共int Id{get;set;}
公共列表时间段{get;set;}
公共客户客户{get;set;}
}
公共类时间段
{
公共int Id{get;set;}
公共字符串日期{get;set;}
公共雇员雇员{get;set;}
}
公营雇员
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
那么,如何使用Linq尽可能简单地实现这一点呢?即特定月份和员工的任务和相关时间段。我也希望能够得到它的客户顺便说一句

我想要的是能够得到 特定员工的任务和 特定月份和的时间段 同一月份的每个任务,以及 雇员

这将从模型实例中选择任务,其中该任务至少有一个时间段在所请求员工的请求月份内(未测试):

我想要的是能够得到 特定员工的任务和 特定月份和的时间段 同一月份的每个任务,以及 雇员

这将从模型实例中选择任务,其中该任务至少有一个时间段在所请求员工的请求月份内(未测试):


这是我能想到的最简单的事情:

var tasksWithSegments =
    from segment in model.TimeSegments
    where segment.Date.Month == month
    where segment.Employee.Id == employeeId
    group segment by segment.Task into result
    select new
    {
        Task = result.Key,
        TimeSegments = result.ToArray()
    };
请注意,您可能需要向模型中添加一些属性,例如
model.TimeSegment
TimeSegment.Task

LINQ查询的技巧通常是从正确的集合开始。在这种情况下,理想的起点是
TimeSegments

另外,我不确定
Date.Month==Month
是否真的能与EF一起工作,但我认为它会(也就是EF4.0)


更新:

你能演示一下如何扩展这个吗 查询并获取一个项目的任务 特定的客户呢

我不确定你的意思,但你可以像这样过滤前面的查询:

var tasksWithSegmentsForCustomers =
    from taskWithSegments in tasksWithSegments
    where taskWithSegments.Task.Customer.Id == customerId
    select taskWithSegments;
我可以将返回类型设置为列表吗 包含时间段列表的任务列表 如果我有这个方法

同样,不确定您到底想要什么,但如果您想要两个没有关系的单独列表,您可以这样做:

List<Task> tasks = (
    from taskWithSegments in tasksWithSegments
    select taskWithSegments.Task).ToList();

List<TimeSegments> segments = (
    from taskWithSegments in tasksWithSegments
    from segment in taskWithSegments.Segments
    select segment).ToList();
列出任务=(
从taskWithSegments中的taskWithSegments
选择taskWithSegments.Task).ToList();
列表段=(
从taskWithSegments中的taskWithSegments
从taskWithSegments.Segments中的段
选择段).ToList();
当然,如果这是您需要的,那么将原始查询重写为以下内容可能会更容易:

    public class Model //Simplified representation of the Entity Framework model
    {
        public List<Task> Tasks { get; set; }
    }

    public class Task
    {
        public int Id { get; set; }
        public List<TimeSegment> TimeSegments { get; set; }
        public Customer Customer { get; set; }
    }

    public class TimeSegment
    {
        public int Id { get; set; }
        public string Date { get; set; }
        public Employee Employee { get; set; }
    }

    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
List<TimeSegment> segments = (
    from segment in model.TimeSegments
    where segment.Date.Month == month
    where segment.Employee.Id == employeeId
    select segment).ToList();

List<Task> allTasks =
    segments.Select(s => s.Task).Distinct().ToList();
列表段=(
从model.TimeSegments中的段
其中segment.Date.Month==月份
其中segment.Employee.Id==employeeId
选择段).ToList();
列出所有任务=
segments.Select(s=>s.Task).Distinct().ToList();
一旦掌握了编写LINQ查询的诀窍,就再也不想回到编写SQL语句或老式的foreach语句了


想想林克

这是我能想到的最简单的事情:

var tasksWithSegments =
    from segment in model.TimeSegments
    where segment.Date.Month == month
    where segment.Employee.Id == employeeId
    group segment by segment.Task into result
    select new
    {
        Task = result.Key,
        TimeSegments = result.ToArray()
    };
请注意,您可能需要向模型中添加一些属性,例如
model.TimeSegment
TimeSegment.Task

LINQ查询的技巧通常是从正确的集合开始。在这种情况下,理想的起点是
TimeSegments

另外,我不确定
Date.Month==Month
是否真的能与EF一起工作,但我认为它会(也就是EF4.0)


更新:

你能演示一下如何扩展这个吗 查询并获取一个项目的任务 特定的客户呢

我不确定你的意思,但你可以像这样过滤前面的查询:

var tasksWithSegmentsForCustomers =
    from taskWithSegments in tasksWithSegments
    where taskWithSegments.Task.Customer.Id == customerId
    select taskWithSegments;
我可以将返回类型设置为列表吗 包含时间段列表的任务列表 如果我有这个方法

同样,不确定您到底想要什么,但如果您想要两个没有关系的单独列表,您可以这样做:

List<Task> tasks = (
    from taskWithSegments in tasksWithSegments
    select taskWithSegments.Task).ToList();

List<TimeSegments> segments = (
    from taskWithSegments in tasksWithSegments
    from segment in taskWithSegments.Segments
    select segment).ToList();
列出任务=(
从taskWithSegments中的taskWithSegments
选择taskWithSegments.Task).ToList();
列表段=(
从taskWithSegments中的taskWithSegments
从taskWithSegments.Segments中的段
选择段).ToList();
当然,如果这是您需要的,那么将原始查询重写为以下内容可能会更容易:

    public class Model //Simplified representation of the Entity Framework model
    {
        public List<Task> Tasks { get; set; }
    }

    public class Task
    {
        public int Id { get; set; }
        public List<TimeSegment> TimeSegments { get; set; }
        public Customer Customer { get; set; }
    }

    public class TimeSegment
    {
        public int Id { get; set; }
        public string Date { get; set; }
        public Employee Employee { get; set; }
    }

    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
List<TimeSegment> segments = (
    from segment in model.TimeSegments
    where segment.Date.Month == month
    where segment.Employee.Id == employeeId
    select segment).ToList();

List<Task> allTasks =
    segments.Select(s => s.Task).Distinct().ToList();
列表段=(
从model.TimeSegments中的段
其中segment.Date.Month==月份
其中segment.Employee.Id==employeeId
选择段).ToList();
列出所有任务=
segments.Select(s=>s.Task).Distinct().ToList();
一旦掌握了编写LINQ查询的诀窍,就再也不想回到编写SQL语句或老式的foreach语句了


想想林克

好的,但这将只选择包含这些时间段的任务,然后