首页 > 解决方案 > EF Core 仅在属性为 true 时才包含列表

问题描述

我有2个模型,

 public class Bin : INotifyPropertyChanged
    {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]   
    public int Id { get; set; }    

    public IList<Produit> Produits
    {
        get;
        set;
    }      
} 

 public class Produit : INotifyPropertyChanged
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }


        public bool Actif
        {
            get
            {
                return _Actif;
            }
            set
            {
                if (_Actif != value)
                {
                    _Actif = value;
                    RaisePropertyChanged("Actif");
                }
            }
        }
     }

在我的 ViewModel 中,我尝试仅在属性“Actif”为真时才包含 Produit:

Bin bins = new ObservableCollection<Bin>(await db.Bins.Include(b=>b.Produits).Where(b => b.Produits.Count() > 0).ToListAsync());

如果我使用:

 Bin bins = new ObservableCollection<Bin>(await db.Bins.Include(b => b.Produits.Where(p => p.Actif)).Where(b => b.Produits.Count() > 0).ToListAsync());

我收到如下错误:

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

当我在查询中包含“Produit”时,如何仅加载“Actif”产品?

这完美地工作:

bins = new ObservableCollection<Bin>(db.Bins.Where(b => b.Produits.Count() > 0).Select(p => new
                {
                    p,
                    Produit = p.Produits.Where(pp => pp.Actif)
                })
               .AsEnumerable()
               .Select(x => x.p)
               .ToList()
               );

唯一的问题是它无论如何都会加载实体,但具有空属性。但是 IF 解决了这个问题。

标签: c#linqentity-framework-core

解决方案


编辑

我想 就是你想要做的......

Bin bins = new ObservableCollection<Bin>(await db.Bins.Where(b => b.Produits.Count() > 0)
.Where(b => b.Produits.Any(p => p.Actif))
.Select(b => new
{
    b,
    Produits = b.Produits.Where(p => p.Actif)
})
.ToListAsync());

推荐阅读