如何通过linq获取这些数据
how to get this data via linq
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
}
public class LoginAudit
{
public int ID { get; set; }
public DateTime LoginTime { get; set; }
}
static void Main(string[] args)
{
List<Employee> AllEmployees = new List<Employee>()
{
new Employee() { ID = 1, Name = "John"},
new Employee() { ID = 2, Name = "Pete"},
new Employee() { ID = 3, Name = "Sue"},
new Employee() { ID = 4, Name = "Chris"},
new Employee() { ID = 5, Name = "Kate"},
new Employee() { ID = 6, Name = "Smith"},
new Employee() { ID = 7, Name = "Bil"},
new Employee() { ID = 8, Name = "Shan"},
new Employee() { ID = 9, Name = "Joe"},
new Employee() { ID = 10, Name = "Lure"}
};
List<int> SomeEmployeesIDs = new List<int>()
{
1, 2, 5, 6, 10
};
List<LoginAudit> EmployeeLogins = new List<LoginAudit>()
{
new LoginAudit() { ID = 1, LoginTime = new DateTime(2015,1,11)},
new LoginAudit() { ID = 5, LoginTime = new DateTime(2015,2,2)}
};
}
我想要 select 来自 AllEmployees 的员工的所有内容满足以下条件。
1. 在 SomeEmployeesIDs AND
中拥有 ID
2. 全部都没有登录(意思是在 EmployeeLogins 中没有条目)或者如果他们上次登录是在 7 天前)
基于此,我应该得到 ID 为 1、5、6 和 10 的员工。有人可以帮我编写 Linq 查询来检索这些数据吗?
我想你需要这样的东西:
var result = AllEmployees.Where( x=> SomeEmployeesIDs.Contains(x.ID) &&
((!EmployeeLogins.Any(y=>y.ID==x.ID) ||
EmployeeLogins.Any(y=> y.ID==x.ID &&
(y.LoginTime-DateTime.Now).Days>7)));
您可以使用此查询:
var q = from emp in AllEmployees
join eId in SomeEmployeesIDs on emp.ID equals eId
where !EmployeeLogins
.Any(el => el.ID == emp.ID && (DateTime.Now - el.LoginTime).Days <= 7)
select emp;
Any
中的这个条件涵盖了这两种情况,Join
是 an efficient way 只接受 ID 在另一个集合中的员工。
如果你不喜欢查询语法,你可以使用这个(如果集合很小使用 Contains
):
var q = AllEmployees
.Where(emp => SomeEmployeesIDs.Contains(emp.ID)
&& !EmployeeLogins
.Any(el => el.ID == emp.ID
&& (DateTime.Now - el.LoginTime).Days <= 7));
使用这样的查询:
var employees = AllEmployees.Where(
e => SomeEmployeesIDs.Contains(e.ID) &&
(EmployeeLogins.All(l => l.ID != e.ID) ||
EmployeeLogins.Where(l => l.ID == e.ID).Any(l => (DateTime.Now - l.LoginTime).Days > 7)));
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
}
public class LoginAudit
{
public int ID { get; set; }
public DateTime LoginTime { get; set; }
}
static void Main(string[] args)
{
List<Employee> AllEmployees = new List<Employee>()
{
new Employee() { ID = 1, Name = "John"},
new Employee() { ID = 2, Name = "Pete"},
new Employee() { ID = 3, Name = "Sue"},
new Employee() { ID = 4, Name = "Chris"},
new Employee() { ID = 5, Name = "Kate"},
new Employee() { ID = 6, Name = "Smith"},
new Employee() { ID = 7, Name = "Bil"},
new Employee() { ID = 8, Name = "Shan"},
new Employee() { ID = 9, Name = "Joe"},
new Employee() { ID = 10, Name = "Lure"}
};
List<int> SomeEmployeesIDs = new List<int>()
{
1, 2, 5, 6, 10
};
List<LoginAudit> EmployeeLogins = new List<LoginAudit>()
{
new LoginAudit() { ID = 1, LoginTime = new DateTime(2015,1,11)},
new LoginAudit() { ID = 5, LoginTime = new DateTime(2015,2,2)}
};
}
我想要 select 来自 AllEmployees 的员工的所有内容满足以下条件。
1. 在 SomeEmployeesIDs AND
中拥有 ID
2. 全部都没有登录(意思是在 EmployeeLogins 中没有条目)或者如果他们上次登录是在 7 天前)
基于此,我应该得到 ID 为 1、5、6 和 10 的员工。有人可以帮我编写 Linq 查询来检索这些数据吗?
我想你需要这样的东西:
var result = AllEmployees.Where( x=> SomeEmployeesIDs.Contains(x.ID) &&
((!EmployeeLogins.Any(y=>y.ID==x.ID) ||
EmployeeLogins.Any(y=> y.ID==x.ID &&
(y.LoginTime-DateTime.Now).Days>7)));
您可以使用此查询:
var q = from emp in AllEmployees
join eId in SomeEmployeesIDs on emp.ID equals eId
where !EmployeeLogins
.Any(el => el.ID == emp.ID && (DateTime.Now - el.LoginTime).Days <= 7)
select emp;
Any
中的这个条件涵盖了这两种情况,Join
是 an efficient way 只接受 ID 在另一个集合中的员工。
如果你不喜欢查询语法,你可以使用这个(如果集合很小使用 Contains
):
var q = AllEmployees
.Where(emp => SomeEmployeesIDs.Contains(emp.ID)
&& !EmployeeLogins
.Any(el => el.ID == emp.ID
&& (DateTime.Now - el.LoginTime).Days <= 7));
使用这样的查询:
var employees = AllEmployees.Where(
e => SomeEmployeesIDs.Contains(e.ID) &&
(EmployeeLogins.All(l => l.ID != e.ID) ||
EmployeeLogins.Where(l => l.ID == e.ID).Any(l => (DateTime.Now - l.LoginTime).Days > 7)));