如何将 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等)的情况下执行此操作。

如何将 DbSet<T> 转换为 List<T>

IDBSet 继承自 IQueryable<TEntity>IEnumerable<TEntity>IQueryableIEnumerable,所以你不能以这种方式直接将其投射到列表中。不过,您可以使用.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 类型的对象转换为列表类型。

相关文章: