当必须基于多个联接(包括通过联结表进行多对多)获取数据时,我正在尝试学习编写高效的实体框架查询。在下面的示例中,我想获取包含特定书籍的所有州。
让我们使用具有以下表/实体的模型,所有表/实体均通过导航属性链接:State、City、Library、Book、LibraryBook(图书馆和书籍之间多对多关系的联结表。)
如何最好地返回包含特定书籍的所有状态?我倾向于认为单独的查询可能比 1 个大型查询更好,但我不确定最好的实现是什么。我认为首先在单独的查询中从多对多关系获取 LibraryId 可能是一个很好的开始方法。
为此:
var bookId = 12;
var libraryIds = _context.LibraryBook.Where(l => l.BookId == bookId).Select(s => s.LibraryId);
Run Code Online (Sandbox Code Playgroud)
如果这是首先发生的,我不确定如何最好地查询下一个数据,以便获取包含每个 LibraryId 的城市。我可以使用 foreach:
var cities = new List<City>;
foreach(var libraryId in libraryIds)
{
var city = _context.City.Where(c => c.Library = libraryId)
cities.Add(city);
}
Run Code Online (Sandbox Code Playgroud)
但随后我必须对包含该城市的州执行另一个foreach,这一切加起来会产生大量单独的 SQL 查询!
这真的是解决这个问题的唯一方法吗?如果没有,什么是更好的选择?
提前致谢!