2013-06-09 23 views
6

Tôi đang phát triển một ứng dụng có Khung thực thể. Tôi đã có một hộp kết hợp với tên của các bảng trong cơ sở dữ liệu. Tôi có mã sau:Tránh nhiều nếu - kiểm tra khác - Chọn bảng từ chuỗi sử dụng khung thực thể

string table = cbTables.SelectedItem.ToString(); 
using (var dbContext = new Entities()) { 
    if (table.Equals("Person")) { 
     List<Person> list = (from l in dbContext.People select l).ToList(); 
    } else if (table.Equals("Student")) { 
     List<Student> list = (from u in dbContext.Student select u).ToList(); 
    } else if (table.Equals("Grade")) { 
     List<Grade> list = (from p in dbContext.Grade select p).ToList(); 
} 

làm cách nào để tránh tất cả các kiểm tra nếu có khác? Có thể lấy tên của một lớp từ một chuỗi giữ tên không?

dụ:

string = "Person"; 
var str = //something 
List<str> list = (from u in dbContext.str select u).ToList(); 
+3

Bạn đang làm gì với danh sách sau đó? Điều này cũng có thể ảnh hưởng đến câu trả lời. –

+3

'Từ điển '? – sq33G

+0

Tôi đang mở một biểu mẫu mới với chế độ xem lưới dữ liệu hiển thị toàn bộ bảng. –

Trả lời

2

ComboBox có khả năng hiển thị từ điển thông qua nguồn dữ liệu, do đó bạn có thể ràng buộc văn bản hiển thị với dữ liệu bạn thực sự muốn thay vì kiểm tra văn bản hiển thị. Sau đó, trong trường hợp này chúng tôi sẽ gắn nó vào loại thực thể:

Dictionary<string,Type> typeMap = new Dictionary<string,Type> { 
    { "Person", typeof(Person) }, 
    { "Student", typeof(Student) }, 
    { "Grade", typeof(Grade) }, 
} 

sau đó ràng buộc nó để ComboBox như:

cbTables.DataSource = new BindingSource(typeMap, null); 
cbTables.DisplayMember = "Key"; 
cbTables.ValueMember = "Value"; 

sau đó, khi bạn cần để có được lựa chọn tổ chức nào, sử dụng

Type entityType = (Type) cbTables.SelectedValue; 
DbSet set = dbContext.Set(entityType); 

Tuy nhiên, sau đó bạn cần phải kiểm tra entityType và hiển thị biểu mẫu cho phù hợp. Nếu biểu mẫu của bạn cần Danh sách, ví dụ: Danh sách, sau đó sử dụng

List<Student> studentList = set.Cast<Student>.ToList(); 
1

Giả sử bạn không muốn có một công tắc nhưng bạn muốn một cái gì đó động, bạn có thể sử dụng các truy vấn thay vì:

using (var context = new Context()) 
{ 
    var people = context.Database.SqlQuery<Object>(
         "select * from People").ToList(); 
} 
+0

Có cách nào để làm điều này mà không cần truy vấn sql? –

1

Mở rộng trên nhận xét của tôi:

Bạn có thể khai báo từ điển để ánh xạ từ chuỗi tên bảng của bạn đến DbSet thực tế là bảng của bạn:

string table = cbTables.SelectedItem.ToString(); 
using (var dbContext = new Entities()) { 
    Dictionary<string, DbSet> mapping = new Dictionary<string, DbSet> { 
     { "Person", dbContext.Person }, 
     { "Student", dbContext.Student }, 
     { "Grade", dbContext.Grade } 
    }; 

    //... 

Sự cố vẫn còn - phải làm gì với bộ kết quả của bạn? Ngay bây giờ bạn đã gõ danh sách với loại cụ thể của mỗi thành viên của bảng; bạn sẽ không thể làm điều đó mà không có một quyết định (nếu/switch) của một số loại.

+1

bạn có thể làm điều tương tự cho các loại "Từ điển mới " và sử dụng Convert.ChangeType để thay đổi nó –

+0

@ron Dictionary dict = new Dictionary {{"Person ", Người } }; đưa ra một lỗi: Person là 'type' nhưng được sử dụng như một 'biến' –

+1

@john, bạn phải sử dụng Dictionary dict = new Dictionary {{"Person", typeof (Người) } }; –

0

Tại sao bạn không sử dụng Chuyển đổi cho mục đích này?

string table = cbTables.SelectedItem.ToString(); 

using (var dbContext = new Entities()) 
{ 
    switch (table) 
    { 
     case"Person": 
      List<Person> list = (from l in dbContext.People select l).ToList(); 
      break; 
     case"Student": 
      List<Student> list = (from u in dbContext.Student select u).ToList(); 
      break; 
     case"Grade": 
      List<Grade> list = (from p in dbContext.Grade select p).ToList(); 
      break; 
    } 
} 
Các vấn đề liên quan