EF: Ленивая загрузка, активная загрузка и «перечисление перечислимого»

Я обнаружил, что не понимаю, что такое отложенная загрузка и т. Д.

Во-первых, эквивалентны ли эти два утверждения:

(1) Lazy loading:
_flaggedDates = context.FlaggedDates.Include("scheduledSchools")
.Include  ("interviews").Include("partialDayAvailableBlocks")
.Include("visit").Include("events");

(2) Eager loading:
_flaggedDates = context.FlaggedDates;

Другими словами, в (1) " Включает "вызывает загрузку коллекций / свойств навигации вместе с конкретной запрошенной коллекцией, независимо от того, что вы используете ленивую загрузку ... верно?

И в (2) оператор загрузит все объекты навигации даже если вы специально не запрашиваете их, потому что вы используете активную загрузку ... не так ли?

Во-вторых: даже если вы используете активную загрузку, данные не будут фактически загружены из базы данных, пока вы не «перечислите перечислимое» , как в следующем коде:

var dates = from d in _flaggedDates
            where d.dateID = 2
            select d;
foreach (FlaggedDate date in dates)
{
... etc.
}

Данные не будут фактически загружены («перечислены») до цикла foreach ... верно? Другими словами, " тестируется.

Было бы неплохо, если бы можно было как-то сказать:

   if( flag.IsSet( ReallyBigEnum.AnotherOption ) ) { ... }

но перечисления не поддерживают методы экземпляра. Итак, я попробовал использовать шаблонную функцию:

   class Enums
   {
      public static bool IsSet<T>( T flag, T bit ) { return (flag & bit) == bit; }
   }

, но код для проверки битов тогда выглядит так:

   if( Enums.IsSet<ReallyBigEnum>( flag, ReallyBigEnum.AnotherOption ) ) { ... }

, что очень много для написания. Затем я попытался сократить его:

   class Enums
   {
      public static bool IsSet( int flag, int bit ) { return (flag & bit) == bit; }
   }

, но тогда вам нужно привести каждое значение к его базовому типу следующим образом:

   if( Enums.IsSet( (int)flag, (int)ReallyBigEnum.AnotherOption ) ) { ... }

, что также затрудняет кодирование и теряет преимущества проверки типов.

Та же функция могла бы быть написанным с использованием параметров объекта, но тогда тип объекта и базовый тип должны быть протестированы.

Итак, я придерживаюсь стандартного, избыточного способа наверху.

Есть ли у кого-нибудь другие идеи относительно чистого, простого способа тестирования бита Enum поля?

Большое спасибо.

10
задан Chris C. 16 September 2010 в 20:33
поделиться