在 Linq 查询上需要一些帮助,第三级包括 where

Posted

技术标签:

【中文标题】在 Linq 查询上需要一些帮助,第三级包括 where【英文标题】:Need some help on a Linq query, 3rd level include where 【发布时间】:2020-04-12 18:48:41 【问题描述】:

我已经搜索了互联网,但无法找到适合我的具体案例的内容。

这是我的模型:

    public class Unit

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UnitID  get; set; 
    public string Name  get; set; 
    public int UnitStatusID  get; set; 
    public List<ReservationUnit> ReservationUnits  get; set; 



public class ReservationUnit 

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ReservationUnitID  get; set; 

    [Required]
    public int ReservationID  get; set; 
    public Reservation Reservation  get; set; 

    [Required]
    public int UnitID  get; set; 
    public Unit Unit  get; set; 

    public decimal Amount  get; set; 
    public bool AmountIsTaxInclusive  get; set; 
    public bool IsFixedRate  get; set; 


public class Reservation

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ReservationID  get; set; 

    public int ReservationStatusID  get; set; 

    public List<ReservationUnit> Units  get; set; 


我需要找到:

statusid == 1 的所有单位 对于所有这些单位,reservationid == 1 的所有预订

我可以获取单元并且可以选择所有的预订单元...但我无法过滤预订以获取包含的预订项目。谁能指出我正确的方向?这是我尝试过的:

var unitQuery = 
                db
                .Units
                .Where(x => x.UnitStatusID == 1 || x.UnitStatusID == 4)
                .Include(o => o.ReservationUnits.Where(p => p.Reservation.ReservationStatusID == 1))
                .ToList();

这给了我以下错误:

System.ArgumentException: '包含路径表达式必须引用在类型上定义的导航属性。对引用导航属性使用虚线路径,对集合导航属性使用 Select 运算符。 (参数'路径')'

【问题讨论】:

尝试分开Includewhere进行预订。 【参考方案1】:

这似乎对我有用。

var unitQuery =
                db
                .Units
                .Include("ReservationUnits.Reservation")
                .Where(x => x.UnitStatusID == 1 || x.UnitStatusID == 4)
                .Where(x => !x.ReservationUnits.Any() || x.ReservationUnits.Any(o => o.Reservation.ReservationStatusID == 1 || o.Reservation.ReservationStatusID == 2))
                ;

这看起来正确吗?

【讨论】:

您可以保持包含强类型:.Include(x =&gt; x.ReservationUnits).ThenInclude(y =&gt; y.Reservation) 您的 Where 子句谓词似乎与您的问题所说的不一致

以上是关于在 Linq 查询上需要一些帮助,第三级包括 where的主要内容,如果未能解决你的问题,请参考以下文章

Linq:高性能数据库查询仅查询每个第 n 个元素

在 Linq 查询中需要帮助

EF6 Linq 查询。仅包括返回子表的第一个条目

在使用 LINQ 的对面到内部联接查询方面需要帮助

linq一些简单操作

LINQ to DataSet 查询帮助