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