在实体框架查询中过滤“包含”表“很多”表的集合。我正在尝试将该集合作为查询的一部分进行过滤——我对EntityFramework还很陌生,而且我很难搞清楚。简化示例:作者有书,书有IsFiction列。我想要一个经过过滤的作者列表,以及所有小说书籍。没有过滤器,这很容易:varq=fromaindb.Authors.Include("Books")wherea.BirthYear>1900selecta;之后我可以过滤,例如:varfictionBooks=a.Books.Where(b=>b.IsFiction);但问题是原始查询已经运行,并且包含那些结果,这是不必要的数据库处理。我可以像这样单独查询:varq=fromaindb.Authorswherea.BirthYear>1900selecta;foreach(varainq){varbooks=frombindb.Bookswhere((b.Author.Id==a.Id)&&(b.IsFiction))selectb;但当然这是每个作者的电话,我也想避免。我可以倒退,例如:varallBooks=frombindb.Books.Include("Author")whereb.IsFictionselectb;但后来我又回到了最初的问题,除了现在是作者方面而不是书籍方面。必须有一个包罗万象的解决方案——我可以很容易地在SQL中做到这一点:select*fromauthoraleftjoinbookbona.id=b.author_idandb.is_fiction=1wherea.birth_year>1900有什么建议吗?前进方向:varq=fromaindb.Authors.Include("Books")wherea.BirthYear>1900selectnew{Author=a,FictionBooks=a.Books.Where(b=>b.IsFiction)};Else一种方法,源自问题底部的SQL:varq=fromaindb.Authorsfrombindb.Books.Include("Author")wherea.BirthYear>1900&&b.IsFiction&&a.Id==b.Author.Idselectnew{Author=a,Book=b};这两者之间的主要区别在于,第一个基本上会给你一个作者数组和每个作者的小说书籍列表(可能是空的);而第二个会给你一组作者/书籍对(所以它不会返回没有小说书籍的任何作者)。以上就是C#学习教程:过滤EntityFramework查询中的“contains”表,共享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
