2009-08-20 17 views
6

Trong một trong các câu hỏi trước đây của tôi về việc sử dụng chuỗi được tạo động (trong đó điều khoản) và sử dụng chúng trong LINQ, tôi đã được hướng dẫn về LINQ Dynamic Query Thư viện Dynamic LINQ.Sử dụng Thư viện Truy vấn Động LINQ với Từ điển <string, object> và .AsQueryable()

Vấn đề đầu tiên là nó chỉ áp dụng cho IQueryable, tuy nhiên điều này có thể được khắc phục bằng cách sử dụng phương thức mở rộng .AsQueryable() trên mọi IEnumerable.

Vấn đề tôi gặp phải là LINQ động đang tìm kiếm một thuộc tính được gọi là "CustomerID" (hoặc bất kỳ thứ gì được chuyển vào vị từ chuỗi cho LINQ động) trên Từ điển của tôi. Điều này rõ ràng sẽ không hoạt động vì Từ điển chỉ có Khóa và Giá trị.

Vì vậy, suy nghĩ tôi đang thông minh, tôi đã tạo một lớp mở rộng : Dictionary<string, object>, ICustomTypeDescriptor`.

Điều này cho phép tôi ghi đè GetProperties() trên loại. Điều đó thật tuyệt. Bây giờ tôi có thể lặp lại các phím Từ điển và thêm chúng vào một số PropertyDescriptorCollection được trả lại.

Nhưng sau đó tôi gặp phải sự cố khác. Trong suốt thư viện Dynamic LINQ, chúng hoạt động với 'Expression instance' chỉ chứa một Type. Nhưng đối với giải pháp CustomTypeDescriptor của tôi để làm việc tôi cần một ví dụ thực tế của Loại, trước khi tôi có thể áp dụng TypeDescriptor.GetProperties(instance, false).

Vì vậy, hãy chuyển sang câu hỏi thực tế. Lấy tất cả thông tin trên vào tài khoản, làm cách nào để áp dụng mệnh đề tùy chỉnh ở định dạng chuỗi "CustomerID = 1234 AND Quantity> = 10000" cho truy vấn LINQ nếu dữ liệu được lưu trữ trong Từ điển có cặp khóa-giá trị.

Giải pháp hiện tại của tôi đang chuyển dữ liệu thành một số DataTable và sử dụng phương thức .Select(query). Mà làm việc, nhưng tôi quan tâm đến việc tìm kiếm các giải pháp khác. Đặc biệt cho mục đích đo điểm chuẩn.

Bất kỳ ý tưởng nào?

Trả lời

2

Thứ nhất - nếu bạn bạn truy cập vào một cuốn từ điển theo cách này, sau đó bạn không sử dụng nó như một cuốn từ điển - bạn đã thử:

var qry = myDictionary.Values.AsQueryable().Where(sQuery); 

(lưu ý rằng nếu bạn đang sử dụng object, bạn sẽ có lẽ muốn có một Cast<Customer> hoặc OfType<Customer> ở một nơi nào đó)

Nếu không:

các T trong IEnumerable<T> (và do đó cũng cho IQueryable<T> sau khi gọi AsQueryable() phương pháp khuyến nông) cho một Dictionary<TKey,TValue>KeyValuePair<TKey,TValue> - vì vậy bạn sẽ có thể sử dụng Where("Value.CustomerID == 12345") hoặc một cái gì đó tương tự.

+1

Thú vị về điều này. Tuy nhiên var qry = myDictionary.Values.AsQueryable(). Where (sQuery); sẽ chỉ tìm kiếm Giá trị của từ điển là tất cả các đối tượng, do đó, nó vẫn không thể truy cập tên thực được lưu trữ trong Khóa "CustomerID". Với đề xuất thứ hai của bạn, gần nhất tôi có thể nhận được bất kỳ thứ gì hoạt động với thư viện LINQ động đang sử dụng: chuỗi tìm kiếm như: "Keys [" CustomerID "] == 12345", nhưng nó vẫn xuất hiện sâu hơn trong thư viện , vì chúng trở về chỉ là tham chiếu đến KeysCollection chứ không phải giá trị cụ thể. – Jabezz

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