简体   繁体   English

过滤器导航属性 EF 核心

[英]Filter navigation property EF core

In my repository I try to filter the products with the variants active but I do not know how because is first time.在我的存储库中,我尝试过滤具有激活变体的产品,但我不知道如何,因为这是第一次。 I should return all products with or without variants active我应该退回所有有或没有变体的产品

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();
}

The field I want to filter on is in Varianti .我要过滤的字段在Varianti

How can do .Where(v => v.Active == 1) ? .Where(v => v.Active == 1)怎么办?

Just add your filter to where Method只需将您的过滤器添加到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();
}

if you don't need the value of Varianti you can remove include part如果您不需要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();
}

Add to Where() clause and use Any() :添加到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();

To get all products with active variants need to make a projection to new article object and there filter variants要获得所有具有活动变体的产品,需要对新文章对象进行投影并过滤变体

This is the solution这是解决方案

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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM