EF Core包含一个ICollection <t>,在集合的引用对象

时间:2017-11-22 14:54:07

标签: c# entity-framework linq entity-framework-core

我需要一个返回所有Driver的查询,包括每个Departures集合,其中每个集合都按Departure的属性进行过滤。

此查询:

// id supplied by HTTP POST
var driver = await _context.Drivers
  .Include(d => d.Departures.Where(dd => dd.Acknowledged == false))
  .SingleOrDefaultAsync(m => m.ID == id);

生成错误:

  

InvalidOperationException:属性表达式'd =&gt; {从   出发dd in.d.Departures where([dd] .Acknowledged == False)select   [dd]}'无效。表达式应代表属性   访问:'t =&gt; t.MyProperty”。有关包括相关的更多信息   数据,请参阅http://go.microsoft.com/fwlink/?LinkID=746393

我不理解什么?

模型

  • Driver有很多Departures
  • Departure有一个Driver

驱动:

public class Driver
{
    public int ID { get; set; }
    ...
    public virtual ICollection<Departure> Departures { get; set; }
}

出发:

public class Departure
{
    public int ID { get; set; }
    public Boolean Acknowledged { get; set; }
    ...
    public int DriverID { get; set; }
    public virtual Driver Driver { get; set; }
}

将EF Core 2.0与VS Studio for Mac配合使用。

1 个答案:

答案 0 :(得分:0)

您无法对Driver对象本身的离场进行过滤,但您可以根据返回值对其进行过滤:

var driverAndDepartures = await _context.Drivers
  .Select(d => new {
      Driver = d
  ,   UnacknowledgedDepartures = d.Departures.Where(dd => !dd.Acknowledged).ToList()
  })
  .SingleOrDefaultAsync(m => m.ID == id);

返回driverAndDeparturesnull - 检查结果后,您可以通过driverAndDepartures.Driver获取驱动程序,并通过driverAndDepartures.UnacknowledgedDepartures字段获取未确认的离开。

如果您尝试获取driverAndDepartures.Driver.Departures,您将阅读整个未经过滤的离队集。