我有以下课程:
public class Foo
{
[Key]
public int ID { get; set; }
public virtual ICollection<Cat> Cats { get; set; }
}
我正在尝试选择包含特定Cat对象的所有Foo对象。目前我这样做:
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();
答案 0 :(得分:2)
您正在拨打ToList()
2次。在第二行中调用ToList时,它会执行查询表达式并将结果加载到lps变量。您正在对下一行的内存数据进行过滤。
您可以避免执行查询表达式的第一个ToList()
调用,并将过滤代码合并到同一行。
var catIdToCheck = 10;
var result = db.Foos.Where(g=>g.Cats.Any(y=>y.Id==catIdToCheck)).ToList();