如何将 DbSet 转换为 List
本文关键字:List 转换 DbSet | 更新日期: 2023-09-27 17:56:21
鉴于以下简化的实体框架 6 上下文,我正在尝试使用实体填充列表,但在如何通过反射进行转换(我相信)方面遇到了问题。
public class FooContext : DbContext
{
public virtual IDbSet<FooClass> Foo { get; set; }
//...
}
public class FooClass
{
public int Id{ get; set; }
public string Name {get; set; }
//...
}
public main()
{
using (var context = new FooContext())
{
var sets = typeof(FooContext).GetProperties().Where(pi => pi.PropertyType.IsInterface && pi.PropertyType.GetGenericTypeDefinition().ToString().ToLower().Contains("idbset"));
foreach (var set in sets)
{
//When I debug and enumerate over 'value' the entire results are shown so I believe the reflection part is OK.
var value = set.GetValue(context, null);
//Always returns null. How can I cast DbSet<T> to List<object> or List<T>?
var list = value as List<object>();
//...
}
}
}
我正在为我正在做的一些集成测试的实用程序方法执行此操作。我正在尝试在不使用直接内联SQL调用(使用SqlConnection和SqlCommand等)来访问数据库(因为数据存储可能会更改为Oracle等)的情况下执行此操作。
IDBSet 继承自 IQueryable<TEntity>
、IEnumerable<TEntity>
、IQueryable
和 IEnumerable
,所以你不能以这种方式直接将其投射到列表中。不过,您可以使用.ToList()
或.ToListAsync()
来DBSet
中所有实体的List<TEntity>
不过,这会在内存中创建所有实体的副本,因此您应该考虑直接在 DBSet 上使用 LINQ 进行操作。
//dont forget using System.Linq;
using (var context = new FooContext())
{
IQueryable<FooClass> rtn = from temp in context.Foo select temp;
var list = rtn.ToList();
}
除了VicYam的回答之外,这里有一个更简单的方法,有一个详细的解释。
添加 System.Linq
命名空间后,不再需要获取IQueryable
,然后转换为 List
。相反,您将获得DbSet
对象的扩展方法。
这是什么意思?您可以简单地返回DbSet
本身,因为它继承自IEnumerable
。然后,使用者(可能是开发人员)可以执行.ToList
或他们可能需要的任何其他列表类型。
简单
这将按原样返回DbSet
,该已经继承自IEnumerable
,这是一个列表类型,然后可以转换为List
。
List<ObjectType> list = new List<ObjectType>();
using (var context = new FooContext())
{
list = context.Foo;
}
另类
您可以立即从IEnumerable
转换为List
。
using (var context = new FooContext())
{
var list = context.Foo.ToList();
}
仍然想要维克亚姆的答案,但作为一条线?
using (var context = new FooContext())
{
var list = context.Foo.AsQueryable().ToList();
}
private StudentDatabaseEntities db = new StudentDatabaseEntities();
public List<StudentDatabaseDbTableModel> AllProducts()
{
return db.StudentDatabaseDbTableModel.ToList();
}
.db。StudentDatabaseDbTableModel 的类型为 DbSet。ToList 是 DbSet 类中的一个方法。方法将 DbSet 类型的对象转换为列表类型。