C# EF Core一对多与IQueryable

C# EF Core一对多与IQueryable,c#,linq,entity-framework-core,C#,Linq,Entity Framework Core,我试图在基于表的模型(Driver)和基于SQL查询的模型(DriverSchedule)之间创建一对多关系 我很难让这个架构正常运行 驱动程序型号: [Table("Drivers")] public class Driver { [Key] [Column("DriverKey")] public int ID { get; set; } ... public virtual ICollection<DriverSchedule> Driv

我试图在基于表的模型(
Driver
)和基于SQL查询的模型(
DriverSchedule
)之间创建一对多关系

我很难让这个架构正常运行

驱动程序
型号:

[Table("Drivers")]
public class Driver
{
    [Key]
    [Column("DriverKey")]
    public int ID { get; set; }
    ...
    public virtual ICollection<DriverSchedule> DriverSchedules { get; set; }
}
public class DriverSchedule
{
    public int DriverID { get; set; }  // foreign key
    public DateTime Date { get; set; }
    public bool IsScheduled { get; set; }
    public virtual Driver Driver { get; set; }
}
VendorDbContext
context:

public class VendorDbContext : DbContext
{
    ...
    public DbSet<Driver> Drivers { get; set; }
    ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<DriverSchedule>().HasKey(table => new { table.DriverID, table.Date });
        modelBuilder.Entity<Driver>().HasMany(d => d.DriverSchedules).WithOne(s => s.Driver);
        ...
        modelBuilder.Query<DriverSchedule>();
    }

    public IQueryable<DriverSchedule> DriverSchedules(DateTime startingDate, DateTime endingDate) =>
        Query<DriverSchedule>().FromSql("<SQL>");
}
当我运行代码时,这一行:

modelBuilder.Query<DriverSchedule>();
从驱动器时间表中删除导航属性:

//public virtual Driver Driver { get; set; }
从建模创建中删除关系定义:

// modelBuilder.Entity<DriverSchedule>().HasKey(table => new { table.DriverID, table.Date });
// modelBuilder.Entity<Driver>().HasMany(d => d.DriverSchedules).WithOne(s => s.Driver);
出现此错误时失败:

属性“Driver”不是实体类型的导航属性 “DriversSchedule”。“Include(string)”方法只能用于 “.”导航属性名称的分隔列表

**/编辑0**

**编辑1**

SELECT  m.DriverID, c.Date
        ,CAST( CASE WHEN COUNT(CASE WHEN c.date <> CAST(m.StartTime AS DATE) THEN NULL ELSE m.MovementID end)>0 THEN 1 ELSE 0 END AS BIT) IsScheduled
FROM    dbo.Calendar c
CROSS APPLY vMovements m
WHERE  1 = 1
AND   c.date BETWEEN {startingDate} AND {endingDate}
AND   m.DriverID IS NOT NULL
GROUP BY c.date, m.DriverID
选择m.DriverID,c.日期
,强制转换(计数时的大小写(c.date强制转换时的大小写(m.StartTime作为日期),然后NULL ELSE m.MovementID end)>0,然后1 ELSE 0作为位结束)已调度
来自dbo.Calendar c
交叉应用V移动m
其中1=1
c.介于{startingDate}和{endingDate}之间的日期
m.DriverID不是空的
按c.日期分组,m.DriverID
**/编辑1**

SELECT  m.DriverID, c.Date
        ,CAST( CASE WHEN COUNT(CASE WHEN c.date <> CAST(m.StartTime AS DATE) THEN NULL ELSE m.MovementID end)>0 THEN 1 ELSE 0 END AS BIT) IsScheduled
FROM    dbo.Calendar c
CROSS APPLY vMovements m
WHERE  1 = 1
AND   c.date BETWEEN {startingDate} AND {endingDate}
AND   m.DriverID IS NOT NULL
GROUP BY c.date, m.DriverID

我缺少什么?

这是因为您已经有一个名为DriversSchedule的实体

这里的问题是:

modelBuilder.Entity<DriverSchedule>();
modelBuilder.Query<DriverSchedule>(); // wrong. 
然后:

modelBuilder.Query();
最后:

 public IQueryable<Driversched> DriverSchedules(DateTime startingDate, DateTime endingDate) =>
        Query<DriverSchedule>().FromSql("<SQL>");
public IQueryable DriverSchedules(DateTime startingDate,DateTime endingDate)=>
Query().FromSql(“”);

建议不要将实体类用作模型

我看不出
IQueryable
模型是如何连接到
驱动程序的。当我枚举
driver.DriverSchedules
时,它如何知道它是否引用了
ICollection
IQueryable
?为了更好地了解您的问题,您能否共享SQL查询?
modelBuilder.Query<DriverSchedule>().HasOne<Driver>().WithMany();
model = await _context.DriverSchedules(startDate.Date, endDate.Date)
           .Include("Driver")
           .ToListAsync();
SELECT  m.DriverID, c.Date
        ,CAST( CASE WHEN COUNT(CASE WHEN c.date <> CAST(m.StartTime AS DATE) THEN NULL ELSE m.MovementID end)>0 THEN 1 ELSE 0 END AS BIT) IsScheduled
FROM    dbo.Calendar c
CROSS APPLY vMovements m
WHERE  1 = 1
AND   c.date BETWEEN {startingDate} AND {endingDate}
AND   m.DriverID IS NOT NULL
GROUP BY c.date, m.DriverID
modelBuilder.Entity<DriverSchedule>();
modelBuilder.Query<DriverSchedule>(); // wrong. 
public class Driversched
{
    public int DriverID { get; set; }  // foreign key
    public DateTime Date { get; set; }
    public bool IsScheduled { get; set; }
    public virtual Driver Driver { get; set; }
}
modelBuilder.Query<Driversched>();
 public IQueryable<Driversched> DriverSchedules(DateTime startingDate, DateTime endingDate) =>
        Query<DriverSchedule>().FromSql("<SQL>");