Entity Framework Include () строго типизированный

43

Есть ли способ сделать это строго типизированным с помощью метода System.Data.Entity.Include? В приведенном ниже методе Эскалация представляет собой ICollection < > .

public IEnumerable<EscalationType> GetAllTypes() {
  Database.Configuration.LazyLoadingEnabled = false;
  return Database.EscalationTypes
    .Include("Escalation")
    .Include("Escalation.Primary")
    .Include("Escalation.Backup")
    .Include("Escalation.Primary.ContactInformation")
    .Include("Escalation.Backup.ContactInformation").ToList();
}
Теги:
entity-framework

2 ответа

83
Лучший ответ

Это уже доступно в Entity Framework 4.1.

См. здесь для справки о том, как использовать функцию include, а также показано, как включать несколько уровней: http://msdn.microsoft.com/en-us/library/gg671236(VS.103).aspx

Сильно типизированный метод Include() - это метод расширения, поэтому вам нужно запомнить объявление using System.Data.Entity;.

  • 4
    Это должно быть помечено как правильный ответ. Особенно для тех из нас, кто так привык к ReSharper, предлагая using операторы, что мы забываем, что нам нужно время от времени добавлять их вручную.
  • 1
    Пропавшее заявление об использовании было то, что я получил. Спасибо за напоминание.
Показать ещё 1 комментарий
6

Кредит переходит на Joe Ferner:

public static class ObjectQueryExtensionMethods {
  public static ObjectQuery<T> Include<T>(this ObjectQuery<T> query, Expression<Func<T, object>> exp) {
    Expression body = exp.Body;
    MemberExpression memberExpression = (MemberExpression)exp.Body;
    string path = GetIncludePath(memberExpression);
    return query.Include(path);
  }

  private static string GetIncludePath(MemberExpression memberExpression) {
    string path = "";
    if (memberExpression.Expression is MemberExpression) {
      path = GetIncludePath((MemberExpression)memberExpression.Expression) + ".";
    }
    PropertyInfo propertyInfo = (PropertyInfo)memberExpression.Member;
    return path + propertyInfo.Name;
  }
}
ctx.Users.Include(u => u.Order.Item)
  • 11
    Эта логика уже включена в пространство имен System.Data.Entity. Вы можете использовать Включить с выражением <Func <TSource, TProperty >>. Обратите внимание, что Escalation является ICollection <Escalation>.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню