【问题标题】:Using lambda expressions to return value from 1table while it compares value from 2 tables使用 lambda 表达式从 1 个表返回值,同时比较 2 个表的值
【发布时间】:2014-07-24 11:12:07
【问题描述】:

我不知道应该在标题中更准确地说什么,但我会解释我的问题/问题。

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

例子:

Table1 = 部门
ID_部门
名称_部门


表 2 = 员工 Id_Employee 姓名_员工 ID_部门 ...

我正在尝试编写一个 lambda 表达式,通过我在程序中传递给 API 的 Name_Department 从员工那里获取所有数据。其中表 1 中的 ID_department 等于表 2 中的 ID_Department,但不知道 ID_department 本身。

为了更容易理解,这里有一个示例查询(由 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%'

提前致谢

【问题讨论】:

  • 不是实体框架?如果您没有 ORM,那么您将无法有效地使用 lambda 表达式来查询数据库,除非您带回所有记录,填充某种数据集,然后在该数据集上使用 lambda 表达式......虽然我认为这很讨厌...... . 最好在 sql 本身中执行 lamda 功能。
  • 是的,我有一个使用实体框架的数据库模型,数据集已经使用查询填充(从员工中选择 *)

标签: c# visual-studio-2010 lambda sql-server-2012


【解决方案1】:

不知道为什么要在数据集上使用 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();
}

【讨论】:

    【解决方案2】:

    我为您编写了一个 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();
    }
    

    希望对你有帮助

    【讨论】:

    • 嗨,感谢这篇完整的帖子,但是我遇到了一个问题,我似乎无法使用我的上下文,因为我使用的是 vs2010,所以我必须使用 ef5 dbcontext 来制作一个当我尝试调用它的名字时,它没有显示。我错过了什么吗?我应该使用一些“使用”参考吗?谢谢
    • dbContext 默认情况下不称为 dbContext,您必须新建一个(在合理的地方)执行类似 'var dbContext = new MyDatabaseEntities();' 之类的操作。 MyDatabaseEntities 是您在创建 EDMX(EF 映射文件)时设置的名称。如果您不记得自己的名字,请查看您的 Web.Config/App.Config 或 EDMX 下的设计器文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多