2017-01-12 4 views
1

Это мой первый опыт работы с Entity Framework (EF), и я пытаюсь узнать, что именно выполняет запрос в моей базе данных, а что нет.Попытка выяснить, когда выполняются запросы в Entity Framework

Это код, с которым я работаю. Не обращайте внимания на функциональность, это не важно для этого вопроса.

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().

Как близко к истине я? Все ли это правильно? Если это не имеет смысла, не могли бы вы привести пример, который выполняет запрос, а что нет?

Извините, что задал столько вопросов в одном вопросе, но я думал, что мне не нужно создавать так много вопросов, потому что все это касается одной темы.

+0

«Попытка выяснить, как работает платформа Entity Framework» - как долго у вас есть! – Nick

+0

_ «Объясните для каждого из этих фрагментов, выполняются ли они запрос базы данных« _ (моя интерпретация вашего вопроса), не является полезным вопросом.Что, если вы напишете еще один фрагмент кода, вы собираетесь задать новый вопрос? Вместо этого задайте вопрос, на который вы действительно хотите получить ответ. – CodeCaster

+0

@CodeCaster Я просто хочу выяснить, когда запросы выполняются в базе данных. Я новичок в EF, поэтому я не уверен, что произойдет. Я не хочу выполнять 3 запроса, когда я могу объединить их в 1. Я лучше сформулирую свой вопрос. – RandomStranger

ответ

2

Если вы не хотите выполнять запрос, вы можете использовать AsEnumerable.

ToList против 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.

0

Выполнение запроса Linq различно для каждого запроса. Я рекомендую прочитать следующую страницу: https://msdn.microsoft.com/en-us/library/bb738633(v=vs.110).aspx

+0

Да, я уберу второй вопрос – RandomStranger

+0

Ваш ответ не является ответом, прочитайте [Ответы, содержащие только ссылки в других местах «хорошие ответы»?] (Http://meta.stackexchange.com/questions/8231/are -answers-that-just-содержать-ссылки-в другом месте-действительно-хорошие ответы) – CodeCaster

+0

@CodeCaster В любом случае вопрос плохо для SO. – ChrisBint

Смежные вопросы