枚举整个 LinqToSql 对象
Enumerate Entire LinqToSql Object
我的数据库包含 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...)
}
我能想到的唯一方法就是反射,像这样的扩展方法你将能够一次获得所有对象:
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();
}
但在任何情况下都不应将其视为处理数据库的好方法。
我的数据库包含 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...)
}
我能想到的唯一方法就是反射,像这样的扩展方法你将能够一次获得所有对象:
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();
}
但在任何情况下都不应将其视为处理数据库的好方法。