【问题标题】:Filter navigation property EF core过滤导航属性 EF 核心
【发布时间】:2019-03-18 16:18:28
【问题描述】:

在我的存储库中,我尝试过滤具有活动变体的产品 但我不知道如何,因为是第一次。 我应该退回所有有或没有变体有效的产品

public async Task<IEnumerable<Articolo>> GetArticoliByDivisioneAsync(string divisione)
{
    return await _ctx.Articoli
                     .Where(a => a.Divisione == divisione
                                 && a.Category!= "001")
                     .Include(i => i.Varianti)
                     .Include(i => i.FotoArticoli)               
                     .ToListAsync();
}

我要过滤的字段位于Varianti

.Where(v =&gt; v.Active == 1)怎么办?

【问题讨论】:

    标签: c# linq entity-framework-core


    【解决方案1】:

    只需将您的过滤器添加到where 方法

    public async Task<IEnumerable<Articolo>> GetArticoliByDivisioneAsync(string divisione)
    {
        return await _ctx.Articoli
            .Where(a => a.Divisione == divisione
                      && a.Category!= "001"
                      && a.Varianti.Any(v=>v.Active == 1))
            .Include(i => i.Varianti)
            .Include(i => i.FotoArticoli)               
            .ToListAsync();
    }
    

    如果您不需要Varianti 的值,您可以删除包含部分

    public async Task<IEnumerable<Articolo>> GetArticoliByDivisioneAsync(string divisione)
    {
        return await _ctx.Articoli
            .Where(a => a.Divisione == divisione
                      && a.Category!= "001"
                      && a.Varianti.Any(v=>v.Active == 1))
            .Include(i => i.FotoArticoli)               
            .ToListAsync();
    }
    

    【讨论】:

    • 我认为重要的是要提到这将加入 Varianti 表。在某些情况下,它会影响性能。
    • 我尝试过,但我得到'List 不包含 Active 的定义'......所以我在这里发布了问题
    【解决方案2】:

    添加到Where() 子句并使用Any()

    return await _ctx.Articoli
            .Include(i => i.Varianti)
            .Include(i => i.FotoArticoli)
            .Where(a => a.Divisione == divisione
                      && a.Category!= "001"
                      && a => a.Varianti.Any(v => v.Active == 1))
    
            .ToListAsync();
    

    【讨论】:

    • 显然我也证明了这一点
    • 所以我只得到至少有一个变体的产品......但我也有没有变体的产品
    • 那么,上面的查询是否只返回带有v.Active == 1 的条目?还是返回其他条目?
    • YES 只返回 active==1 的条目
    • 你想要发生什么?
    【解决方案3】:

    要获得所有具有活动变体的产品,需要对新文章对象进行投影并在那里过滤变体

    这就是解决办法

    public async Task<IEnumerable<Articolo>> GetArticoliByDivisioneAsync(string divisione)
    {
        return await _ctx.Articoli
                         .Where(a => a.Divisione == divisione
                                     && a.Category!= "001")
                         .Include(i => i.Varianti)
                         .Include(i => i.FotoArticoli)               
                         .Select(x => new Articolo
                        {
                            Codice = x.Codice ,
                            Prezzo = x.Prezzo ,
                            Varianti = x.Varianti.Where(v => v.attivo== 0).ToList(),
                            FotoArticoli = x.FotoArticoli
                        })           
                    .ToListAsync();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2018-02-03
      • 2017-06-12
      相关资源
      最近更新 更多