我一直在寻找年龄但是我找不到解决问题的办法。 由于我是一个真正的初学者,我对EF不太了解,我尝试了很多解决方案,但无法找到正确的道路。
我正在使用EntityFramework6。 我有4张桌子:
我需要列出一段时间内的所有预订,并且还要支付员工以及“截止日期”的关联班次。员工与班次之间的关系是多对多关系。在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
感谢您的帮助。我很感激。
最诚挚的问候。
答案 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。