我必须Employee根据他们进行过滤department。我可以使用LINQ进行相同的操作。
Linq并lambda编译以得到相同的结果。编译器Lambda expression在编译之前将查询表达式更改为等效表达式,因此生成的IL完全相同。资源
var deptCollection = new List<Dept>();
var employeeCollection = new List<Employee>();
employeeCollection.Add(new Employee { Id = 1, Name = "Eldho" });
deptCollection.Add(new Dept { DepetarmentName = "a", EmployeeId = 3 });
deptCollection.Add(new Dept { DepetarmentName = "a", EmployeeId = 1 });
var empinadept = (from e in employeeCollection
from dep in deptCollection
where e.Id == dep.EmployeeId
&& dep.DepetarmentName == "a"
select e)
.ToList();
Run Code Online (Sandbox Code Playgroud)
我无法
.Where在此Lambda中添加子句
var empindeptLamda = employeeCollection
.Join(deptCollection,
emp => emp.Id, dep => dep.EmployeeId,
(em, dep) => em.Id == dep.EmployeeId
&& dep.DepetarmentName == "a")
.ToList();
class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
class Dept
{
public int EmployeeId { get; set; }
public string DepetarmentName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Q1。上面的linq的等效lambda语句是什么?(如何在方法语法中的linq中添加where子句
与此等效:
var empinadept = (from e in employeeCollection
from dep in deptCollection
where e.Id == dep.EmployeeId
&& dep.DepetarmentName == "a"
select e)
.ToList();
Run Code Online (Sandbox Code Playgroud)
这是:
var result = employeeCollection.Join(deptCollection,
e => e.Id,
dep => dep.EmployeeId,
(e,dep) => new { e, dep })
.Where(item => item.dep.DepetarmentName == "a")
.Select(item => item.e)
.ToList();
Run Code Online (Sandbox Code Playgroud)
更好的选择是:
var result = employeeCollection.Join(
deptCollection.Where(dep => dep.DepetarmentName == "a"),
e => e.Id,
dep => dep.EmployeeId,
(e,dep) => e)
.ToList();
Run Code Online (Sandbox Code Playgroud)
最接近查询语法的(但我会说这不是基于好意见的):
var result = employeeCollection.Join(
deptCollection,
e => new { e.Id, "a" },
dep => new { dep.EmployeeId, dep.DepartmentName },
(e,dep) => e).ToList();
Run Code Online (Sandbox Code Playgroud)