2010-06-22 22 views
11

Tôi chạy thành công các tuyên bố sau với NorthWind.sdf trong LinqPad:Có phương pháp chung nào để kiểm tra xem một thuộc tính xác định được nhà cung cấp LINQ hỗ trợ hay không, đặc biệt là OData?

from s in Shippers 
    select new 
{ 
    s.ShipperID, 
    s.CompanyName,  
    Count=s.ShipViaOrders.Count()  
} 

Cùng lúc đó, tôi thất bại trong việc điều hành một tuyên bố tương tự với các dịch vụ OData (http://services.odata.org/northwind/northwind.svc) trong LinqPad:

from s in Shippers  
select new 
{ 
    s.ShipperID, 
    s.CompanyName,  
    Count=s.Orders.Count()  
} 

Lỗi là "Xây dựng hoặc khởi tạo phiên bản của loại <> f__AnonymousType0`3 [System.Int32, System.String, System.Int32] với biểu thức s.Orders.Count() không được hỗ trợ.".

Tôi biết dịch vụ OData rất hạn chế trong Hỗ trợ LINQ. Tôi có hỗ trợ câu lệnh LINQ động trong ứng dụng của tôi. Thực ra tôi đang cố di chuyển nguồn dữ liệu từ Compact SQL Server sang dịch vụ OData.

Vì vậy, tôi phải đối phó với NotSupportedException theo cách tổng quát. Hiện nay, tôi cố gắng để kiểm tra cú pháp của tài sản xác định trước khi chạy nó, chẳng hạn như

"s.Orders.Count() as Count" 

Nó trôi qua kiểm tra của tôi, nhưng nó gặp NotSupportedException của OData.

Có cách nào để kiểm tra xem một thuộc tính xác định (bởi một chuỗi hoặc lambda) có được nhà cung cấp LINQ hỗ trợ không?

Mọi đề xuất đều được đánh giá cao.

Ying

Trả lời

6

Thật không may là không có cách lập trình chung để kiểm tra xem nhà cung cấp LINQ có thể dịch bất kỳ truy vấn cụ thể nào không. Thông thường bạn sẽ phải sử dụng tài liệu hoặc (để chắc chắn) thực sự thử các truy vấn như bạn đang làm. Tuy nhiên,

Các nhà cung cấp khác nhau có thể cung cấp một số cơ chế tạo ra một số biểu diễn cho truy vấn mà bạn có thể sử dụng để kiểm tra xem truy vấn có hoạt động không.

Trong trường hợp máy khách OData, bạn có thể gọi .ToString() trên truy vấn và nó sẽ trả về một URL nếu nó có thể xử lý thành công truy vấn; nếu không nó sẽ trả về một thông báo lỗi trông giống như 'Lỗi dịch biểu thức LINQ thành URI: ...' (thông báo lỗi thực tế có thể thay đổi tùy theo ngôn ngữ người dùng, nhưng nó sẽ chắc chắn không phải là URI hợp lệ).

+0

@Ying: Điều này nghe như * câu trả lời * cho tôi. Nếu có, bạn có thể muốn chấp nhận nó. – chiccodoro

2

Thật không may là cách duy nhất để tìm hiểu là thử nghiệm một truy vấn cụ thể hoặc thông qua tài liệu nếu người tạo ra nhà cung cấp LINQ đã cung cấp danh sách chi tiết về những gì không được hỗ trợ.

Bản thân LINQ có một đặc tả rất lỏng lẻo được xác định chủ yếu bởi các phương pháp mở rộng được xác định trên IQueryable/IEnumerable. Việc triển khai nhà cung cấp LINQ có nghĩa là bạn phải triển khai bản dịch qua nguồn dữ liệu - ví dụ: LINQ to SQL dịch cây biểu thức thể hiện trong truy vấn LINQ thành SQL được hiểu bởi nhà cung cấp cơ sở dữ liệu. Mỗi nguồn dữ liệu có những hạn chế riêng mà cuối cùng sẽ chi phối những gì có thể được hỗ trợ, và tương tự như vậy mỗi nhà cung cấp LINQ có thể chọn thực hiện (hoặc không thực hiện) bất kỳ phương thức hoặc hành vi cụ thể nào.Có thể là trường hợp đây chỉ là hạn chế của nhà cung cấp bên trong LINQPad để xử lý OData - bạn có thể muốn kiểm tra OQuery thay vào đó và xem liệu nó có cung cấp khả năng tốt hơn cho bạn hay không - hãy xem xét http://beta.code.msdn.microsoft.com/OQuery-Building-OData-d2e75eed để biết chi tiết và tải xuống.

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