В моем репозитории я пытаюсь отфильтровать продукты с активными вариантами. но я не знаю как, потому что это первый раз. Я должен вернуть все продукты с активными вариантами или без них
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 => v.Active == 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();
}
я пытаюсь это сделать, но получаю «Список <Variante> не содержит определения для Active» ... поэтому я разместил здесь вопрос
Добавьте в пункт 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? Или он возвращает дополнительные записи?
ДА вернуть только запись с активным == 1
И что вы хотите, чтобы произошло?
я доказал && ( a.Varianti.Any(v => v.RdvObsoleta == 0) || !a.Varianti.Any())) и кажется вполне работает
Отлично :) Если мой ответ помог, пожалуйста, примите и проголосуйте :)
Это то, что вы хотите: && a => (a.Varianti.Any(v => v.Active == 1) || !a.Varianti.Any())? Это должно получить любой v.Active == 1 и включать записи, которых нет в Varianti @gigiLaTrottola
я думаю, что это работает, но это не так... Все продукты и варианты возвращены: фильтр не работает!!!
@gigiLaTrottola, можете ли вы отредактировать свой вопрос, включив в него точные требования?
Я улучшил свои требования и добавил решение
Чтобы получить все товары с активными вариантами, нужно сделать проекцию на новый объект статьи и там отфильтровать варианты.
Это решение
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();
}
Я думаю, важно упомянуть, что это присоединится к таблице Varianti. В некоторых случаях это может повлиять на производительность.