在linq中加入两个表问题

时间:2018-10-15 11:32:17

标签: asp.net-mvc linq asp.net-mvc-5 entity-framework-6 linq-to-entities

我正在开发一个用于报告和更新的Web门户。 用于显示记录。 我正在从控制器参数传递ID。

如果要从一个表中获取数据,则工作正常。 例如

Var employee = slp.urlt.where ( x=> x.Id == Id).ToList ();

但是当我与另一个表联接时,会出现错误

var result = from ut in slp.urlt
                     join ct in slp.Cities on ut.City equals ct.Id
                     where ut.Id == Id
                     select new
                     {
                         ut.R_Name_Enn,
                         ut.R_Name_Arr,
                         ut.R_Addr_Enn,
                         ut.R_Addr_Arr,
                         ct.Id,
                         ct.Name,
                         ct.Name_Arr
                     };

所以我正在用sql ..进行以下查询,在sql中工作正常。

SELECT A.R_name_e,A.R_name_a,A.R_addr_e,A.R_addr_a,B.Id,B.Name,B.Name_ar FROM urlt A inner join City B on A.City = B.Id WHERE A.Id = 90000001

2 个答案:

答案 0 :(得分:0)

我认为您忘记放置查询或将其转换为列表。列在最后。

var result = (from ut in slp.urlt
                     join ct in slp.Cities on ut.City equals ct.Id
                     where ut.Id == Id
                     select new
                     {
                         ut.R_Name_Enn,
                         ut.R_Name_Arr,
                         ut.R_Addr_Enn,
                         ut.R_Addr_Arr,
                         ct.Id,
                         ct.Name,
                         ct.Name_Arr
                     }).ToList();

答案 1 :(得分:0)

好的,因此您拥有一个DbContextEmployees的{​​{1}}。每个Cities都生活在Employee中;每个City是零个或多个City的驻留位置。显然,使用外键的简单一对多关系。

entity framework code-first conventions之后,您将获得与以下类相似的内容:

Employees

由于我遵循实体框架代码的第一约定,因此实体框架将能够检测表和列以及城市与雇员之间的一对多关系。

仅当您要对表或列使用非默认名称时,才需要属性或流利的API。

回到您的问题

  

给出一个class City { public int Id {get; set;} // every city Houses zero or more Employees: public virtual ICollection<Employee> Employees {get; set;} ... // other properties } class Employee { public int Id {get; set;} // every Employee lives in exactly one City, using foreign key public int CityId {get; set;} public virtual City {get; set;} } class MyDbContext : DbContext { public DbSet<City> Cities {get; set;} public DbSet<Employee> Employees {get; set;} } ,您想要Id的多个属性   Employee,其中包含Id的几个属性   City

您可以使用联接。但是,如果使用Employee属性,则实体框架足够聪明,可以了解需要哪个连接。该代码对读者来说看起来自然得多:

City

我希望只有一名员工具有此ID。要获取此员工,请使用:

var queryEmployees = myDbcontext.Employees   // from the sequence of all Employees
    .Where(employee => employee.Id == Id)    // keep only the employee with this Id
    .Select(employee => new                  // from the remaining employees
    {                                        // make one new object with properties:
        NameEnn = employee.R_Name_Enn,
        NameArr = ut.R_Name_Arr,
        AddrEnn = ut.R_Addr_Enn,
        AddrArr = ut.R_Addr_Arr,            
        City = new                           // I chose to make a sub-property for city
        {                                     // if desired, you can flatten it.
            Id = employee.City.Id,
            Name = employee.City.Name,
            NameArr = employee.City.Name_Arr,
        },
    });

或者如果您真的想要一个包含此var fetchedEmployee = queryEmployees.FirstOrDefault(); 的列表:

Employee

如果您真的认为联接更具可读性,并且具有更好的可维护性-我怀疑,您可以使用内部联接获得相同的结果:

var fetchedEmployees = queryEmployees.ToList();