这是我第一次使用Entity Framework(EF),我试图了解究竟在我的数据库上执行什么查询以及什么不是。
这是我正在使用的代码。不要介意功能,这对这个问题并不重要。
using (var db = new Context())
{
//Check if any reviews have been given.
if (combinedReviews.Any())
{
var restaurantsReviewedIds = combinedReviews.Select(rev => rev.RestaurantId);
//(1)
ratedRestaurants = db.Restaurants.Where(rest => restaurantsReviewedIds.Contains(rest.Id))
.DistinctBy(rest => rest.Id)
.ToList();
}
//(2)
var restsClose = db.Restaurants.Where(rest => db.Reviews.Any(rev => rev.RestaurantId == rest.Id))
.OrderBy(rest => rest.Location.Distance(algorithmParams.Location))
.Take(algorithmParams.AmountOfRecommendations);
//(3)
tempList = ratedRestaurants.Union(restsClose).ToList();
var tempListIds = tempList.Select(rest => rest.Id); //Temporary list.
//(4)
restsWithAverage = db.Reviews.Where(rev => tempListIds.Contains(rev.RestaurantId))
.GroupBy(rev => rev.RestaurantId)
.ToList();
}
我用数字标记了每段代码,所以我会用它来引用它们。以下是我认为会发生的事情。
这会执行查询,因为我在此处调用.ToList()
。
这会返回IQueryable
,因此不会对数据库执行查询。
这将从(2)执行查询。
这会执行另一个查询,因为我正在调用.ToList()
。
我的真相有多接近?这一切都正确吗?如果这没有意义,你能举例说明执行查询的内容以及什么不是吗?
我很抱歉在一个问题上提出了这么多问题,但我认为我不需要创建这么多问题,因为所有这些问题只涉及一个主题。
答案 0 :(得分:2)
如果您不想执行查询,可以使用AsEnumerable
。
ToList
vs AsEnumerable
ToList
- 将IEnumerable<T>
转换为List<T>
。使用AsEnumerable
与ToList
的优势在于AsEnumerable
不会执行查询。 AsEnumerable
保留延迟执行,并且不构建通常无用的中间列表。
另一方面,当需要强制执行LINQ查询时,ToList
可以是一种方法。
您也可以通过在查询表达式之后立即放置For Each循环来强制执行,但是通过调用ToList或ToArray,您可以将所有数据缓存到单个集合对象中。
ToLookup
和ToDictionary
也在执行查询。
在这里您可以找到运算符列表以及它们是否正在执行查询: https://msdn.microsoft.com/en-us/library/mt693095.aspx
答案 1 :(得分:0)
每个查询的Linq查询执行不同。我建议您阅读以下页面:https://msdn.microsoft.com/en-us/library/bb738633(v=vs.110).aspx