Как получить Родительские данные с ребенком, применил условие на ребенка - PullRequest
0 голосов
/ 03 октября 2018

Я не знаю, как будет называться мой вопрос.

У меня есть два класса

public class Product
{
    public int Id { get; set; }

    public string Name { get; set; }  

    public virtual ICollection<Spec> Specs { get; set; }
}

public class Spec
{
    public int Id { get; set; }

    public string Name { get; set; }

    public bool IsActive { get; set; }

    public virtual Product Product { get; set; }
}

Теперь мне нужно получить продукт со спецификацией, если спецификация IsActive верна в LINQ.Я попытался, но не получил никакого результата.

var products = db.Products.Where(x => x.Specs.All(a => a.IsActive)).ToList();

Но мой ожидаемый результат не получается.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018
class Program
{
    static void Main(string[] args)
    {
        var p = new List<Product>();

        p.Add(new Product() { Id = 1, Specs = new List<Spec>() { new Spec() { Id = 90, IsActive = true }, new Spec() { Id = 91, IsActive = false } } });
        p.Add(new Product() { Id = 2, Specs = new List<Spec>() { new Spec() { Id = 92, IsActive = false }, new Spec() { Id = 93, IsActive = false } } });
        p.Add(new Product() { Id = 3, Specs = new List<Spec>() { new Spec() { Id = 94, IsActive = true}, new Spec() { Id = 95, IsActive = true} } });
        p.Add(new Product() { Id = 4, Specs = new List<Spec>() { new Spec() { Id = 96, IsActive = true }, new Spec() { Id = 97, IsActive = true } } });


        //Brings Products with ALL Spec.IsActive True
        var products = p.Where(x => x.Specs.All(a => a.IsActive)).ToList();
        Console.WriteLine("ALL ->" + string.Join(",", products.Select(pro => pro.Id.ToString()).ToArray()));
        //result is 3,4

        //Brings Products with ANY Spec.IsActive True
        var products2 = p.Where(x => x.Specs.Any(a => a.IsActive)).ToList();
        Console.WriteLine("ANY ->" + string.Join(",", products2.Select(pro => pro.Id.ToString()).ToArray()));
        //result is 1,3,4

        Console.ReadLine();
    }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }


    public virtual ICollection<Spec> Specs { get; set; }
}

public class Spec
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsActive { get; set; }


    public virtual Product Product { get; set; }
}
0 голосов
/ 03 октября 2018

Вы получаете товары из базы данных.Lazy Loading продукты не будут загружать спецификации, попробуйте включить их:

var products = db.Products.Include("Specs").Where(x=>x.Specs.All(a=>a.IsActive)).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...