LINQ查询在LINQ Pad中工作而不在VS中

时间:2016-03-24 23:38:27

标签: c# linq

我在LINQPad(https://www.linqpad.net/)中创建了以下查询,并且一切正常。

var UserEvents = from e in _context.Events
                 join s in _context.Shifts on e.ShiftID equals s.SHFID
                 where e.UID == userID
                 select new UserEvents
                 {
                     EVTID = e.EVTID,
                     UID = e.UID,
                     ShiftID = e.ShiftID,
                     EVTDate = e.EVTDate,
                     Notes = e.Notes,
                     AreaID = s.Area.AreaID,
                     AreaDesc = s.Area.AreaDesc,
                     CPYDesc = s.Area.Company.CPYDesc,
                     StartTime = s.StartTime,
                     EndTime = s.EndTime,
                     RequiredResources = s.RequiredResources,
                     ShiftDesc = s.ShiftDesc,
                     ShiftDayOfWeek = s.ShiftDayOfWeek
                 };

当我把它移到 VS时,它抱怨Shift没有Area的定义。

这是真的Shift.cs不包含对Area的显式声明,因为在public List<Shift> SHFID { get; set; }

的区域中指定了

现在我很想弄清楚如何在不填充表格结构的情况下使这个查询工作(首先使用代码Entity.Framework)

Shifts.c​​s

public class Shift
{
    [Key]
    public int SHFID { get; set; }
    public TimeSpan StartTime { get; set; }
    public TimeSpan EndTime { get; set; }
    public int RequiredResources { get; set; }
    public string ShiftDesc { get; set; }
    public string ShiftDayOfWeek { get; set; }
    public DateTime ShiftExDateStart { get; set; }
    public DateTime ShiftExDateEnd { get; set; }
    public int ShiftExLevel { get; set; }
    public TimeSpan ShiftExStartTime { get; set; }
    public TimeSpan ShiftExEndTime { get; set; }
}

Area.cs

public class Area
{
    [Key]
    public int AreaID { get; set; }
    public string AreaDesc { get; set; }
    public Boolean AreaActive { get; set; }
    public DateTime AreaCreatedDate { get; set; }
    public List<Shift> SHFID { get; set; }
}

2 个答案:

答案 0 :(得分:0)

您基本上要做的是获取shift对象的Area属性 AreaID = s.Area.AreaID, 这是错误的,因为您的数据模型表示区域可以包含1-> n关系的移位。你需要在e.AreaId上的区域添加另一个连接,并使用该对象获取区域的属性

var UserEvents = from e in _context.Events
                 join s in _context.Shifts on e.ShiftID equals s.SHFID
                 join a in _context.Areas on e.AreaID equals a.AreaID
                 where e.UID == userID
                 select new UserEvents
                 {
                     EVTID = e.EVTID,
                     UID = e.UID,
                     ShiftID = e.ShiftID,
                     EVTDate = e.EVTDate,
                     Notes = e.Notes,
                     AreaID = a.AreaID,
                     AreaDesc = a.AreaDesc,
                     CPYDesc = a.Company.CPYDesc,
                     StartTime = s.StartTime,
                     EndTime = s.EndTime,
                     RequiredResources = s.RequiredResources,
                     ShiftDesc = s.ShiftDesc,
                     ShiftDayOfWeek = s.ShiftDayOfWeek
                 };

答案 1 :(得分:0)

  

好吧,在Shift中添加一个属性Area。 EF应该将它作为两个类之间的1:n(Area:Shift)关系进行选择,并将其转换为SQL连接。 - 格特阿诺德

这解决了我的问题,

public Area Area { get; set; }添加到我的班级,可以进行我正在寻找的导航。