2015-06-15 22 views
5

Với bối cảnh Entity Framework 6 đơn giản sau đây, tôi đang cố gắng đưa vào Danh sách với các thực thể nhưng gặp vấn đề với cách truyền (tôi tin) qua phản xạ.Làm thế nào để đúc DbSet <T> vào Danh sách <T>

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>(); 

      //... 
     } 
    } 
} 

Tôi đang làm điều này cho phương pháp tiện ích cho một số thử nghiệm tích hợp mà tôi đang thực hiện. Tôi đang cố gắng để làm điều này mà không cần sử dụng trực tiếp các cuộc gọi SQL nội tuyến (sử dụng SqlConnection và SqlCommand vv) để truy cập cơ sở dữ liệu (như kho dữ liệu có thể thay đổi thành Oracle, vv).

+1

Bạn có thể truyền đến giao diện 'IEnumerable' –

+0

' set.GetValue (context, null) 'trả về một' đối tượng'.Bạn đang cố gắng truyền nó tới 'List '. –

+2

Một 'DbSet <>' * không phải là một danh sách *, và không phải là một 'DbSet 'cũng không phải là một' Danh sách 'là một' Danh sách '. Những gì bạn đang cố gắng làm là cam chịu. Bạn có thể làm rõ ý định của bạn? Bạn muốn * làm gì? –

Trả lời

5

IDBSet thừa hưởng từ IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, và IEnumerable, vì vậy bạn không thể trực tiếp bỏ nó vào một danh sách như vậy. Bạn có thể có được một List<TEntity> của tất cả các đối tượng trong DBSet dù bằng cách sử dụng .ToList() hoặc .ToListAsync()

Điều này tạo ra một bản sao của tất cả các đối tượng trong bộ nhớ mặc dù, vì vậy bạn nên xem xét hoạt động với LINQ trực tiếp trên DBSet

1

Bạn có thể không đúc nó. Chỉ cần tạo một List<T> mới từ bạn DbSet qua ToListAsync<T>() từ một IQueryable bằng cách liệt kê nó không đồng bộ hoặc chỉ đơn giản là thông qua đồng bộ ToList()

Ngoài ra tôi nghĩ tốt hơn tạo thực hiện cụ thể cho các kịch bản của mình. Bây giờ tạo cho EF. Khi bạn sẽ bắt đầu sử dụng NHibernate, ví dụ, tạo thử nghiệm cho nó và như vậy. Nó sẽ đơn giản hơn để hỗ trợ trong tương lai, sau đó thử tạo một cái gì đó chung chung, sẽ phức tạp hơn để sửa chữa và gỡ lỗi.

FYI, bạn có chắc chắn rằng bạn cần các thử nghiệm tích hợp này không? Có thể tốt hơn để kiểm tra xem ánh xạ/triển khai của bạn có đang hoạt động với cơ sở dữ liệu của bạn hay không. Tôi nghĩ nó sẽ là phần quan trọng hơn. Tất nhiên nếu bạn không làm điều đó trước đây.

5
//dont forget using System.Linq; 
using (var context = new FooContext()) 
{ 
    IQueryable<FooClass> rtn = from temp in context.Foo select temp; 
    var list = rtn.ToList(); 
} 
0
private StudentDatabaseEntities db = new StudentDatabaseEntities(); 

public List<StudentDatabaseDbTableModel> AllProducts() 
{ 
    return db.StudentDatabaseDbTableModel.ToList(); 
} 

db.StudentDatabaseDbTableModel là loại DbSet. ToList là một phương thức bên trong lớp DbSet. Phương thức ToList chuyển đổi đối tượng kiểu DbSet thành kiểu List.

+0

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm cả giải thích] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. – DimaSan

+0

Không có phương thức 'ToList()' nào trong DbSet. –

Các vấn đề liên quan