在EntityFramework中使用NativeQuery多个表

时间:2016-05-03 11:06:30

标签: c# sql-server entity-framework linq

我一直在寻找年龄但是我找不到解决问题的办法。 由于我是一个真正的初学者,我对EF不太了解,我尝试了很多解决方案,但无法找到正确的道路。

我正在使用EntityFramework6。 我有4张桌子:

  • 员工(EmployeeId,BadgeNumber,FirstName,LastName,...)
  • Shift(ShiftId,startDate,endDate,ShiftTypeId)
  • TypeShift(TypeShiftId,description,startHour,endHour)
  • Ticking(TickId,TickingDate)

我需要列出一段时间内的所有预订,并且还要支付员工以及“截止日期”的关联班次。员工与班次之间的关系是多对多关系。在DB中生成的桥接表是' EmployeeShift'

起初,我尝试用LINQ做,但我失败了。 我最终得到了一个原生的SQL查询(查询已经过测试并且它正在运行),这是:

 public List<Object> getTickings(DateTime fromDate, DateTime toDate)
 {
    try
    {

        var tickingList= model.Database
         .SqlQuery<Object>("select distinct Employees.numBadge,  Employees.EmployeeId, Employees.firstName, Employees.lastName, Tickings.TickingId, Tickings.tickingDate, TypeShifts.description, Shifts.startDate, Shifts.endDate, TypeShifts.startHour, TypeShifts.endHour
    from Tickings, Employees, Shifts, TypeShifts, EmployeeShift
    where Employees.EmployeeId= Tickings.EmployeeId
    and Tickings.TickingDate <= '" + toDate+ "'
    and Tickings.TickingDate >= '" + fromDate+ "'
    and Employees.EmployeeId= EmployeeShift.employees_EmployeeId
    and EmployeeShift.shifts_ShiftId = shifts_ShiftId
    and Tickings.TickingDate <= Shifts.endDate
     and Tickings.TickingDate >= Shifts.startDate").ToList<Object>();

       return tickingList;
 }
 catch
 {
    return null;
 }
}

现在我有多个表,所以不同的对象。添加&#39;列表&#39;而不是&#39; List&#39;返回的列表不为null但我无法访问列表。我确定我错过了什么。 问题是:我应该怎么做才能使它与原生查询一起使用?或者使用LINQ

感谢您的帮助。我很感激。

最诚挚的问候。

1 个答案:

答案 0 :(得分:1)

首先,我建议使用SQL JOINS,而不是使用查询中使用逗号分隔的表名来获取记录的方式。无论如何,如果它给你正确的结果,那么我不介意它

创建一个SQL视图,然后实体框架将使用该视图中的列生成具有属性的类。通过这种方式,您的查询将变得更加简单,您将能够使用clean&amp; amp;整洁的LINQ语法而不是编写内联查询

CREATE VIEW [dbo].[vTickings]
AS

select distinct Employees.numBadge,  Employees.EmployeeId, Employees.firstName, Employees.lastName, Tickings.TickingId, Tickings.tickingDate, TypeShifts.description, Shifts.startDate, Shifts.endDate, TypeShifts.startHour, TypeShifts.endHour
    from Tickings, Employees, Shifts, TypeShifts, EmployeeShift
    where Employees.EmployeeId= Tickings.EmployeeId
    and Employees.EmployeeId= EmployeeShift.employees_EmployeeId
    and EmployeeShift.shifts_ShiftId = shifts_ShiftId
    and Tickings.TickingDate <= Shifts.endDate
     and Tickings.TickingDate >= Shifts.startDate

END

现在使用简单的LINQ获取需求记录,如

List<vTickings> tickings = db.vTickings.Where(vt=> vt.TickingDate<=toDate && vt.TickingDate >= fromDate).ToList();

我假设你有一个名为db的变量来访问实体框架的dbContext。