使用 linq 查询和实体框架进行检索

Posted

技术标签:

【中文标题】使用 linq 查询和实体框架进行检索【英文标题】:retrieving using linq query and entityframework 【发布时间】:2013-06-27 08:52:24 【问题描述】:

我有如下表结构

员工表

ID   Name
1     A
2     B
3     C
4     D
5     E

员工分配表

Alocationid    ID   Date
1              2    26/6/2013
2              2    25/6/2013
3              1    25/6/2013
4              1    24/6/2013
5              3    24/6/2013
6              4    26/6/2013

现在我需要获取特定日期的可用员工。例如,如果我需要 2013 年 6 月 25 日的可用员工,那么结果将如下所示:-

ID  Name
1   A
3   C
4   D

【问题讨论】:

到目前为止你有没有尝试过? @subash 下次请指定语言并发布一些您已经拥有的代码 @subash 我不明白为什么结果是 25/6/2013 的 A/C/D ,而不是 A/B ? 我需要没有分配到特定日期的员工 【参考方案1】:

101 Linq 是一个很好的参考站点,this sample 似乎最适合您的情况。

【讨论】:

【参考方案2】:

如果您正在使用存储库并希望使用较少查询的方法,您可以使用以下方法:

IQueryable<int> allocatedEmployeeIds = AllocationRepository.DbSet.Where(x => x.Date == referenceDate).Select(x => x.ID);
List<Employee> allocatedEmployees = EmployeeRepository.DbSet.Where(x => allocatedEmployeeIds.Any(y => y == x.ID).ToList();

编辑:如果您想要那些未分配的,只需添加“!”

IQueryable<int> allocatedEmployeeIds = AllocationRepository.DbSet.Where(x => x.Date == referenceDate).Select(x => x.ID);
List<Employee> allocatedEmployees = EmployeeRepository.DbSet.Where(x => !allocatedEmployeeIds.Any(y => y == x.ID).ToList();

【讨论】:

【参考方案3】:

使用组加入来获取每个员工的分配。然后选择那些在特定日期没有任何分配的员工:

from e in db.Employees
join ea in db.EmployeeAllocations 
   on e.ID equals ea.ID into g
where !g.Any(x => x.Date == date)
select e

【讨论】:

嗨,这不是我所期望的。上面的查询返回所有已经被分配到某个日期的员工..我需要所有没有被分配到某个日期的员工

以上是关于使用 linq 查询和实体框架进行检索的主要内容,如果未能解决你的问题,请参考以下文章

LINQ 查询在 C# 中使用实体框架获取单列和单行值而不使用 Where

需要一种方法来使用实体框架核心中的C#Linq从第二个表中检索数据

优化多个 LINQ to Entity Framework 查询

实体框架 Linq 查询:.Where 链 vs &&

使用 LINQ 优化内存中慢查询列表以检索数据

Google 应用引擎:使用键与使用查询检索实体的成本和效率