2016-09-14 3 views
0

У меня есть следующий класс:Как выбрать элемент с определенным элементом в свойстве iCollection?

public class Foo 
    { 
     [Key] 
     public int ID { get; set; } 

     public virtual ICollection<Cat> Cats { get; set; } 
    } 

Я пытаюсь выбрать все объекты Foo, который содержит конкретный объект Cat. В настоящее время я делаю это:

Cat c = new Cat(10); 
var lPs = Bd.Foos.Include("Cats").Where(p => SomeConditions).ToList(); 
var lFilter = lPs.Where(p => p.Cats.Contains(c)).ToList(); 

мне не нравится этот подход, потому что я приношу многих объектов из БД только фильтровать их с помощью Linq.

Есть ли лучший (более эффективный) способ?

, если это полезно, то DbContext определяется следующим образом:

modelBuilder.Entity<Foo>().HasMany(p => p.Cats).WithMany(); 

ответ

2

Вы звоните ToList() 2 раза. Когда вы вызываете ToList во второй строке, он выполняет выражение запроса и загружает результаты в переменную lps. Вы делаете фильтр по данным inmemory в следующей строке.

Вы можете избежать первого вызова ToList(), выполняющего выражение запроса, и слияния кода фильтрации с той же строкой.

var catIdToCheck = 10; 
var result = db.Foos.Where(g=>g.Cats.Any(y=>y.Id==catIdToCheck)).ToList(); 
+0

Это правильно! Благодаря ! – Ayorus