试图找出实体框架中的查询何时执行

时间:2017-01-12 09:36:59

标签: c# sql entity-framework iqueryable

这是我第一次使用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();
}

我用数字标记了每段代码,所以我会用它来引用它们。以下是我认为会发生的事情。

  1. 这会执行查询,因为我在此处调用.ToList()

  2. 这会返回IQueryable,因此不会对数据库执行查询。

  3. 这将从(2)执行查询。

  4. 这会执行另一个查询,因为我正在调用.ToList()

  5. 我的真相有多接近?这一切都正确吗?如果这没有意义,你能举例说明执行查询的内容以及什么不是吗?

    我很抱歉在一个问题上提出了这么多问题,但我认为我不需要创建这么多问题,因为所有这些问题只涉及一个主题。

2 个答案:

答案 0 :(得分:2)

如果您不想执行查询,可以使用AsEnumerable

ToList vs AsEnumerable

ToList - 将IEnumerable<T>转换为List<T>。使用AsEnumerableToList的优势在于AsEnumerable不会执行查询。 AsEnumerable保留延迟执行,并且不构建通常无用的中间列表。

另一方面,当需要强制执行LINQ查询时,ToList可以是一种方法。

您也可以通过在查询表达式之后立即放置For Each循环来强制执行,但是通过调用ToList或ToArray,您可以将所有数据缓存到单个集合对象中。

ToLookupToDictionary也在执行查询。

在这里您可以找到运算符列表以及它们是否正在执行查询: https://msdn.microsoft.com/en-us/library/mt693095.aspx

答案 1 :(得分:0)

每个查询的Linq查询执行不同。我建议您阅读以下页面:https://msdn.microsoft.com/en-us/library/bb738633(v=vs.110).aspx