2013-07-25 34 views
5

Tôi có một số DbSet<T>Truy cập thuộc tính của DbSet theo tên

Tôi muốn truy cập một trong các thuộc tính trên tên đó.

Điều này có khả thi không?

Về cơ bản tôi đang tạo một hàm chung, vì vậy đối với bất kỳ DbSet nào tôi có, tôi có thể chỉ định một cột và liệt kê các giá trị của cột đó.

Bạn có thể tự mình nhận được DbSet từ ngữ cảnh bằng cách thực hiện context.Set(T) nhưng tôi không chắc chắn về các trường.

+0

bối cảnh chung là gì đây? Bạn có thể hiển thị chữ ký của phương thức mà bạn muốn truy vấn của mình bắt nguồn (để xem loại tham số kiểu chung nào chúng ta có) và có lẽ một câu lệnh một dòng sử dụng phương thức đó và kết quả mong đợi? –

+0

Khái niệm là tôi có một bảng gọi là 'sách' và một trong các trường là 'tác giả' và tôi muốn thực hiện tìm kiếm trên cột 'tác giả'. Tôi cũng có rất nhiều bảng khác mà tôi muốn thực hiện tìm kiếm giống hệt nhau, do đó, làm cho một phương pháp chung mà tôi nói cho tôi đối tượng phù hợp ví dụ như. 'IEnumerable ' bằng cách kết hợp cột '" Tác giả "' hoặc bất kỳ cột nào tôi chỉ định. – NibblyPig

Trả lời

7

Tôi đã làm điều gì đó tương tự trong khi quay lại sử dụng sự phản chiếu.

T item = context.Set(T).First(); 
string propName = "MyProperty"; 
object value = item.GetType().GetProperty(propName).GetValue(item, null); 

Tất nhiên lưu ý rằng bạn sẽ hoặc là cần phải cast giá trị cho một loại hình cụ thể bằng tay, hoặc sử dụng ToString, mà nên làm việc khá tốt trên tất cả các loại cơ bản.

Giả định bạn đã có dữ liệu từ máy chủ và hiện cần xử lý dữ liệu.

EDIT:

Nếu bạn muốn tạo một truy vấn, sau đó tôi tìm thấy this!

Rõ ràng, những gì bạn đang tìm kiếm có sẵn trong các ví dụ được cung cấp với Visual Studio (hoặc bạn có thể tải xuống riêng chúng).

Phương thức tiện ích có sẵn cho phép bạn sử dụng .Select("propertyName") trả về IQueriable. Hãy nhớ thêm using System.Linq.Dynamic; (và tất nhiên thêm tệp .cs bắt buộc vào dự án của bạn).

Sau đó, bạn có thể tạo các truy vấn chọn bằng cách chỉ định tên của tham số.

List<object> data = (db.Set<SetType>() 
         .Where("propertyName == @0 && someOtherProperty == @1", propertyValue, someOtherPropertyValue) 
         .Select("propertyName") as IEnumerable<object>).ToList(); 
+0

Thật tuyệt, tôi vừa thử điều này, bạn nghĩ điều gì sẽ xảy ra? Tôi giả sử nó sẽ đơn giản tạo ra một câu lệnh SQL duy nhất vì vậy nếu tôi muốn chọn tất cả các thực thể có một trường "Tên" của "Hello" thì tôi có thể làm dbSet.Where (c => c.GetType ..... GetValue. .. == "Xin chào") và vấn đề về hiệu năng sẽ không thể bỏ qua? – NibblyPig

+0

@SLC Tôi đã tìm thấy giải pháp cho vấn đề của bạn - hãy kiểm tra câu trả lời được cập nhật! :) – Shaamaan

+0

Phải, tôi đã thử bit đầu tiên trông giống như nó làm việc, nhưng LINQ to Entities cố gắng dịch toàn bộ điều GetType GetProperty và thất bại.Tôi đoán bởi vì phần đó cần phải được thực hiện phía máy chủ và chỉ có kết quả nên đi vào LINQ cho các thực thể? 'dbSet.Where (c => c.GetType(). GetProperty (propertyName) .GetValue (c, null) == someString)' – NibblyPig

4

Kiểm tra this article on Dynamic LINQ.

Sử dụng mã được cung cấp, tôi đã có thể viết một LINQ to Entities truy vấn như thế này:

var query = context.Set(Type.GetType("Person")).Select("Name"); 
Các vấn đề liên quan