2015-12-26 2 views
2

У меня есть база данных со 100 + таблицами, которые сильно нормализованы, и данные не часто меняются. Я использую LinqToSql и инкапсулирую некоторые простые отладки и запросы, чтобы весь дизайн БД не нуждался в понимании для получения данных. Я пытаюсь включить быстрое прототипирование, не заботясь о производительности.Перечислить весь объект LinqToSql

Есть ли простой способ перечислить весь объект LinqToSql в контейнер только для чтения в памяти? Кэш с момента времени тоже будет хорош, если что-то подобное существует. Это будет большой, и я полностью понимаю это.

using (Context db = new Context()) 
{ 
    var a = db.Table1s.AsEnumerable(); 
    var b = db.Table2s.AsEnumerable(); 

    var q = a.Where(x => x.SomeComplexMethod()) 
      .Join(b...) 
} 

Я хотел бы быть в состоянии сделать что-то вроде этого:

using (Context db = new Context()) 
{ 
    var enumerated = db.Materialize(); 

    var q = enumerated.Table1s() 
        .Where(x => x.SomeComplexMethod()) 
        .Join(enumerated.Table2s...) 
} 
+1

Я не уверен, что можно сделать доступным только для чтения, но не может ли Entity Framework предоставить вам большую часть функций, которые вы используете? http://www.asp.net/entity-framework – wentimo

+0

@Mark вы хотите создать C# POCOS, который может использоваться в качестве классов модели AFAIK LinqToSql не создает POCOS, вам нужно добавить dbml отдельно к проекту. http://www.codeproject.com/Articles/892233/POCO-Generator это отвечает вашим требованиям –

+0

POCOS используются для реальной сделки, но они больше работают, чтобы делать правильно. Это не для производства, просто что-то быстрое и грязное. –

ответ

0

Единственный способ, что я могу думать о том, отражение, с помощью метода расширения, как это вы сможете получить все объекты в один раз:

public static class ContextExtensions 
{ 
    public static IEnumerable<IQueryable> GetAllDbSets(this DbContext context) 
    { 
     return context.GetType() 
      .GetProperties() 
      .Where(p => p.PropertyType.IsGenericType 
         && p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)) 
      .Select(p => (IQueryable)p.GetValue(context)); 
    } 
} 

Затем вы можете использовать его как это:

using (var context = new ApplicationDbContext()) 
{ 
    var allTables = context.GetAllDbSets(); 

    var allTablesInMemory = context.GetAllDbSets() 
       .Select(q => Enumerable.ToArray((dynamic)q)) 
       .ToArray(); 

    var allValuesInArray = context.GetAllDbSets() 
       .SelectMany<dynamic,dynamic>(q => Enumerable.ToArray(q)) 
       .ToArray(); 
} 

Но в любом случае это не должно рассматриваться как хороший подход к работе с базой данных.

+0

Спасибо. Затем я могу использовать отражение, чтобы получить «имена» материала в возвращаемом массиве. –

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