Свойство навигации фильтра EF core

В моем репозитории я пытаюсь отфильтровать продукты с активными вариантами. но я не знаю как, потому что это первый раз. Я должен вернуть все продукты с активными вариантами или без них

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) ?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 145
3

Ответы 3

Просто добавьте свой фильтр в 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. В некоторых случаях это может повлиять на производительность.

eocron 16.03.2019 18:45

я пытаюсь это сделать, но получаю «Список <Variante> не содержит определения для Active» ... поэтому я разместил здесь вопрос

gigiLaTrottola 16.03.2019 18:47

Добавьте в пункт 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();

Очевидно, я также доказал, что

gigiLaTrottola 16.03.2019 18:50

Таким образом, я получаю только продукты, по крайней мере, с вариантом... но у меня также есть продукт, у которого нет варианта.

gigiLaTrottola 16.03.2019 19:02

Итак, приведенный выше запрос возвращает только записи с v.Active == 1? Или он возвращает дополнительные записи?

haldo 16.03.2019 19:10

ДА вернуть только запись с активным == 1

gigiLaTrottola 16.03.2019 19:11

И что вы хотите, чтобы произошло?

haldo 16.03.2019 19:13

я доказал && ( a.Varianti.Any(v => v.RdvObsoleta == 0) || !a.Varianti.Any())) и кажется вполне работает

gigiLaTrottola 16.03.2019 19:15

Отлично :) Если мой ответ помог, пожалуйста, примите и проголосуйте :)

haldo 16.03.2019 19:17

Это то, что вы хотите: && a => (a.Varianti.Any(v => v.Active == 1) || !a.Varianti.Any())? Это должно получить любой v.Active == 1 и включать записи, которых нет в Varianti @gigiLaTrottola

haldo 16.03.2019 19:25

я думаю, что это работает, но это не так... Все продукты и варианты возвращены: фильтр не работает!!!

gigiLaTrottola 17.03.2019 21:04

@gigiLaTrottola, можете ли вы отредактировать свой вопрос, включив в него точные требования?

haldo 17.03.2019 21:58

Я улучшил свои требования и добавил решение

gigiLaTrottola 18.03.2019 16:51

Чтобы получить все товары с активными вариантами, нужно сделать проекцию на новый объект статьи и там отфильтровать варианты.

Это решение

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

Другие вопросы по теме