枚举整个LinqToSql对象

时间:2015-12-26 06:20:46

标签: c# linq-to-sql

我拥有100多个表格的数据库,这些表格已经过严格规范化,并且数据不会经常更改。我正在使用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 个答案:

答案 0 :(得分: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();
}

但无论如何,它不应被视为使用数据库的好方法。