Entity Framework SqlQuery — Какова цель этого кода (NerdDinner)

#c# #entity-framework

#c# #entity-framework

Вопрос:

Я просматривал код NerdDinner в codeplex и заметил следующее:

 public IQueryable<Dinner> FindByLocation(float latitude, float longitude)
{
    List<Dinner> resultList = new List<Dinner>();

    var results = db.Database.SqlQuery<Dinner>("SELECT * FROM Dinners WHERE EventDate >= {0} AND dbo.DistanceBetween({1}, {2}, Latitude, Longitude) < 1000", DateTime.Now, latitude, longitude);
    foreach (Dinner result in results)
    {
        resultList.Add(db.Dinners.Where(d => d.DinnerID == result.DinnerID).FirstOrDefault());
    }

    return resultList.AsQueryable<Dinner>();
}
  

Мне любопытно, в чем смысл этой строки:

 resultList.Add(db.Dinners.Where(d => d.DinnerID == result.DinnerID).FirstOrDefault();
  

Код вызывает ExecuteQuery для извлечения обедов. Почему необходимо повторно запрашивать FirstOrDefault() для добавления в список?

Комментарии:

1. Каков тип «результатов»??

Ответ №1:

Из документации SqlQuery :

Результаты этого запроса никогда не отслеживаются контекстом, даже если тип возвращаемого объекта является типом сущности.

http://msdn.microsoft.com/en-us/library/gg696545 (VS.103).aspx

Предоставленный код, похоже, является обходным путем для преобразования набора объектов, которые не отслеживаются, в объекты, которые отслеживаются платформой.

Комментарии:

1. Я кое-чему научился здесь. Я бы предпочел вызвать db. Обеды. FirstOrDefault(d => d.DinnerID == результат. DinnerID); хотя