C# 使用lambda表达式从1表返回值,同时比较2表的值

C# 使用lambda表达式从1表返回值,同时比较2表的值,c#,visual-studio-2010,lambda,sql-server-2012,C#,Visual Studio 2010,Lambda,Sql Server 2012,我不知道该在标题中加些什么,但我会解释我的问题 我正在做一个API,并编写一个方法来获取表中的所有数据 例如: 表1=部门 身份证科 部门名称 表2=雇员 雇员身份证 员工姓名 身份证科 我正在尝试编写一个lambda表达式,它通过我在程序中传递给API的部门名称从employee获取所有数据。其中,表1中的ID_部门等于表2中的ID_部门,而不知道ID_部门本身 为了使其更易于理解,这里是一个从head生成的示例查询,因为属性和表不是这些 SELECT EMPLOYEE.ID

我不知道该在标题中加些什么,但我会解释我的问题

我正在做一个API,并编写一个方法来获取表中的所有数据

例如:

表1=部门 身份证科 部门名称

表2=雇员 雇员身份证 员工姓名 身份证科

我正在尝试编写一个lambda表达式,它通过我在程序中传递给API的部门名称从employee获取所有数据。其中,表1中的ID_部门等于表2中的ID_部门,而不知道ID_部门本身

为了使其更易于理解,这里是一个从head生成的示例查询,因为属性和表不是这些

        SELECT EMPLOYEE.ID_EMPLOYEE, EMPLOYEE.NAME_EMPLOYEE, (OTHER EMPLOYEE ATTRIBUTES), DEPARTMENT.NAME_DEPARTMENT
        FROM EMPLOYEE INNER JOIN DEPARTMENT ON 
        EMPLOYEE.ID_DEPARTMENT = DEPARTMENT.ID_DEPARTMENT
        WHERE DEPARTMENT.NAME_DEPARTMENT LIKE '%FINANCE%'

提前感谢

不确定为什么要在数据集上使用lambda表达式。。。像下面这样的东西通常更好。。。顺便说一下,这称为Linq To Entities或L2E,不需要lambda表达式

using (DBContext ctx = new DBContext())
{
    ctx.Connection.Open();

    List<EMPLOYEE> employees = (from e in ctx.EMPLOYEE 
                                join d in ctx.Department on e.IdDepartment equals d.IdDepartment
                                where d.NameDepartment.Contains("FINANCE")
                                select e).ToList();

    ctx.Connection.Close();
}

我已经为您编写了一个LinqPad示例,该示例将演示如何使用LinqPad。LinqPad是免费下载的,您只需将代码粘贴到查询窗口中,并将语言下拉列表更改为“C程序”

public class Department
{
    public int DepartmentId {get; set;}
    public string Name {get; set;}
    public List<Employee> Employees {get; set;}
    public Department()
    {
        Employees = new List<Employee>();
    }
}

public class Employee
{
    public int EmployeeId {get; set;}
    public string Name {get; set;}
    public Department Department {get; set;}
}

void Main()
{
    // set up replica data (much like any ORM would return)  
    List<Department> Departments = new List<Department>();
    List<Employee> iTEmployees = new List<Employee>();
    List<Employee> salesEmployees = new List<Employee>();

    Department iT = new Department(){ Name = "IT", DepartmentId = 1 };
    iTEmployees.Add(new Employee(){EmployeeId = 1, Name = "Jo",  Department = iT});
    iTEmployees.Add(new Employee(){EmployeeId = 2, Name = "Jim",  Department = iT });
    iTEmployees.Add(new Employee(){EmployeeId = 3, Name = "James",  Department = iT });
    iT.Employees = iTEmployees;
    Departments.Add(iT);

    Department sales = new Department(){ Name = "Sales", DepartmentId = 1 };
    salesEmployees.Add(new Employee(){EmployeeId = 1, Name = "Jo",  Department = sales});
    salesEmployees.Add(new Employee(){EmployeeId = 2, Name = "Jan",  Department = sales });
    salesEmployees.Add(new Employee(){EmployeeId = 3, Name = "Jane",  Department = sales });
    sales.Employees = salesEmployees;
    Departments.Add(sales);

    // query objects
    string searchParam = "IT";

    List<Employee> employees = /*dataContext.*/Departments.SelectMany(x=>x.Employees.Where(y=>y.Department.Name.ToLowerInvariant() == searchParam.ToLowerInvariant())).ToList();
    employees.Dump();
}

希望对您有所帮助

不是EntityFramework?如果没有ORM,则无法有效地使用lambda表达式查询数据库,除非返回所有记录,填充某种数据集,然后在该数据集上使用lambda表达式。。。虽然我觉得很恶心。。。最好在sql本身中使用lamda功能。是的,我有一个使用实体框架的数据库模型,数据集已经通过使用来自EmployeesHi的查询Select*填充,感谢这篇完整的文章,但我有一个问题,我似乎无法使用我的上下文,因为我使用的是vs2010,所以我必须使用ef5 dbcontext来创建一个,当我尝试调用它的名称时,它不会显示出来。我错过什么了吗?我应该使用一些参考资料吗?默认情况下,ThanksdbContext不称为dbContext,您必须在合理的位置创建一个新的,执行类似“var dbContext=new MyDatabaseEntities;”的操作。MyDatabaseEntities是创建EDMX EF映射文件时设置的名称。如果记不起它的名称,请查看您的Web.Config/App.Config或EDMX下的设计器文件