Intereting Posts
Как получить запрос, когда он является URLEncoded или имеет символы процента в ASP.NET Использование операторов и методов Close Настройка разрешения / проблемы с компонентом Autofac с общей ко-контравариантностью Как вводить конструктор в controllerы по единству на mvc 4 Значение TextBlock по умолчанию, если результат возвращает значение null Задача возврата мгновенно Приложение Windows Store Приложение для подписки на покупку в приложении Мгновенные уведомления, такие как Facebook Как искать пользователей в глобальном каталоге в лесу AD с несколькими деревьями .NET Преобразование из строки значений Hex в символы Unicode (поддержка разных кодовых страниц) Запись пользовательского IEnumerator с помощью iteratorов Невозможно проанализировать DateTime из строки Дублирование поиска текста Почему я не могу написать Nullable <Nullable >? как вставить строку в первую строку текстового файла?

EF получает список записей во время выполнения от типа

objective: мне нужно закодировать все записи, например:

var records = db.Set().ToList(); 

Затем цикл

 foreach (var record in records) { // do something with the record } 

Но он не должен указывать конкретный во время выполнения, поскольку я должен перебирать типы и поэтому не знаю примера «UserAccount». Только Type / TypeOf?

В нижней части этого описания у меня есть метод loopAllEntities, который я не могу найти способ работы

Я создал DbContext с некоторыми объектами.

 public class MyEntities : DbContext { public DbSet UserAccounts { get; set;} public DbSet UserRoles { get; set; } public DbSet UserAccountRoles { get; set; } } 

Определен список Тип для управления выходом:

 public static List ModelListSorted() { List modelListSorted = new List(); modelListSorted.Add(typeof(UserRole)); modelListSorted.Add(typeof(UserAccountRole)); modelListSorted.Add(typeof(UserAccount)); return modelListSorted; } 

Проблема ниже, где я не могу найти способ сделать это Работа 🙁

 public static loopAllEntities() { List modelListSorted = ModelHelper.ModelListSorted(); foreach (Type type in modelListSorted) { var records = ????? // get a list of records in the current table from type. foreach (var record in records) { // do something with the record } } } 

Похоже, вы почти там, вы должны быть способны сделать что-то вроде следующего:

  public static void loopAllEntities(DbContext dbContext) { List modelListSorted = ModelHelper.ModelListSorted(); foreach (Type type in modelListSorted) { var records = dbContext.Set(type); // do something with the set here } } 

Это даст вам не общий набор для работы. Это зависит от того, что вы хотите сделать, поскольку нет такого типа для этого набора, он может стать немного сложным, может быть, брошен в базовый тип или интерфейс для работы?

Редактировать: у меня недостаточно репутации, чтобы комментировать, но решение Mayoors принесло бы вам то, что вы хотите, без использования нестандартного типа и собрать всю коллекцию.

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

Основная идея – получить список IEnumerable , где каждый IEnumerable является Entity в нашей модели. Причина, по которой мы должны использовать простой старый object состоит в том, что мы хотим, чтобы он возвращал разные объекты, которые не связаны друг с другом. Но это не так уж плохо, поскольку, когда вы проходите через каждый объект, вы можете отдать его определенному объекту, если вам нужно.

Сначала мы создадим метод, который возвращает этот список:

 private static List> AllEntities(MyEntities db) { List> list = new List>(); list.Add(db.UserRole); list.Add(db.UserAccountRole); list.Add(db.UserAccount); return list; } 

Мы переходим в наш DbContext потому что он будет использоваться, когда мы на самом деле начнем цикл через IEnumerables , который происходит за пределами этого метода. Таким образом, мы не можем создать DbContext здесь, а затем Dispose от него.

Теперь мы можем использовать этот метод для прокрутки всех наших объектов:

 using (var db = GetMyEntities()) { List> recordsList = AllEntities(db); foreach (IEnumerable records in recordsList) { foreach (object record in records) { // Do something with record. // If you need to access type-specific properties, // do something like below if (record is UserAccount) { UserAccount account = (UserAccount)record; Console.WriteLine("User Name: " + account.UserName); } } } } 

И это все. С точки зрения SQL он будет делать что-то вроде SELECT * FROM TABLE_NAME для каждой итерации внешнего цикла foreach. Это означает, что он не кэширует данные внутри List> , и каждый раз, когда вы используете AllEntities он получает свежие данные из базы данных.

Я знаю, что это старый вопрос, но вопрос не указывает версию EF, и предлагаемый ответ больше не работает для Entity Framework Core (у DbContext нет нестандартного метода набора в ядре EF, по крайней мере, на дату этого ответа) ,

Тем не менее, вы все еще можете использовать рабочий метод расширения, используя ответ Джона Скита на этот вопрос . Мой код добавляется ниже для удобства.

  public static IQueryable Set(this DbContext context, Type T) { // Get the generic type definition MethodInfo method = typeof(DbContext).GetMethod(nameof(DbContext.Set), BindingFlags.Public | BindingFlags.Instance); // Build a method with the specific type argument you're interested in method = method.MakeGenericMethod(T); return method.Invoke(context, null) as IQueryable; }