2012-02-07 33 views
20

Tôi đã cung cấp một số dịch vụ web để truy cập thông tin.

Điều đầu tiên tôi cố gắng mở rộng một nút. Và tôi đã thực hiện thành công với mã sau đây

http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings 

Bây giờ tôi muốn lọc ServiceOfferingID mà tôi sẽ nhận được khi mở rộng ServiceOfferings. Cách sử dụng tùy chọn bộ lọc đối với bộ sưu tập mở rộng

http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings&$filter=ServiceOfferings.ServiceOfferingID eq 127 

Nhưng không hoạt động. Cách đúng để làm tương tự

+0

Câu trả lời ngắn: thay đổi dấu chấm thành dấu gạch chéo, tức là '& $ filter = ServiceOfferings/ServiceOfferingID eq 127' sẽ hoạt động. – BrainSlugs83

Trả lời

6

Trong OData, lệnh Bộ lọc chỉ hoạt động trên phần tử cấp cao nhất. Đối với bộ lọc của bạn để làm việc bạn sẽ cần phải có URL sau

http://www.domain.com/ODataService/WorkService.svc/CaseStudies(x)/ServiceOfferings?format=json&$filter=ServiceOfferingID eq 127

Rõ ràng đây không phải là truy vấn mà bạn đang cố gắng để viết, nhưng đằng sau hậu trường truy vấn của bạn đã được chuyển đổi thành một cây biểu thức trong đó có một biểu thức gốc dựa trên phần tử cấp cao nhất.

Nếu bạn thực sự cần thiết để lọc dữ liệu bạn có thể có khả năng đánh chặn các truy vấn và viết biểu của riêng bạn như sau:

[QueryInterceptor("CaseStudies")] 
     public Expression<Func<CaseStudie, bool>> CaseStudieFilter() 
     { 
      <Expression here> 
     } 
+0

@nil nếu bạn đọc câu hỏi họ đang thực sự nói về lọc trên mở rộng là địa chỉ trả lời của tôi, điều này khác với lọc theo kiểu phức tạp, vì vậy, mặc dù bạn có thể nói điều này không đúng để mở rộng – SCB

-1

Bạn cũng có thể thực hiện điều này thông qua một WebGet vào dịch vụ. Tôi đã phải làm một cái gì đó tương tự như bộ lọc theo thuộc tính của tài sản.

35

Các truy vấn mà bạn sẽ cần phải viết phụ thuộc vào cardinality của bộ sưu tập mở rộng.

Dưới đây là một số ví dụ sử dụng công khai sample OData Northwind service, provided by odata.org.

Đơn đặt hàng luôn được thực hiện bởi chính xác một khách hàng.

Tìm đơn đặt hàng được thực hiện bởi khách hàng có tên cụ thể: http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/CompanyName eq 'Vins et alcools Chevalier'. Điều này tương đương với câu trả lời của Dhawal.

Khách hàng có thể phát hành nhiều đơn đặt hàng.

Sử dụng quantifierstất cả hoặc bất kỳ để xác định xem bạn có muốn ít nhất một hoặc tất cả các đơn đặt hàng để tuân theo điều kiện của bạn.

  1. tìm kiếm khách hàng mà một hoặc nhiều đơn đặt hàng đã được xử lý bởi một nhân viên cụ thể: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/any(o: o/EmployeeID eq 9)
  2. Tìm kiếm khách hàng chưa đặt bất cứ điều gì trong một thời gian dài: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/all(o: o/OrderDate lt DateTime'1997-01-01')

Bạn có thể hãy gọi http://services.odata.org/V3/Northwind/Northwind.svc/$metadata và kiểm tra các phần tử NavigationProperty để xem mối quan hệ nào tồn tại.

<NavigationProperty Name="Orders" 
    Relationship="NorthwindModel.FK_Orders_Customers" 
    ToRole="Orders" 
    FromRole="Customers"/> 

Sau đó, tìm kiếm một hiệp hội với tên đó và bạn sẽ tìm thấy cardinality:

<Association Name="FK_Orders_Customers"> 
    <End 
     Type="NorthwindModel.Customer" 
     Role="Customers" 
     Multiplicity="0..1"/> 
    <End 
     Type="NorthwindModel.Order" 
     Role="Orders" 
     Multiplicity="*"/> 
    ... 

Duyệt mối quan hệ một-nhiều như thế này: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/EmployeeID eq 9, sẽ cung cấp cho bạn: " Giá trị cha mẹ cho quyền truy cập thuộc tính của thuộc tính 'EmployeeID' không phải là một giá trị duy nhất. Truy cập thuộc tính chỉ có thể được áp dụng cho một giá trị duy nhất. "

Duyệt một-nhiều-một mối quan hệ với tất cả hay bất kỳ, như http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/any(c: c/CompanyName eq 'Vins et alcools Chevalier'), sẽ cung cấp cho bạn: "Bất kỳ/Tất cả chỉ có thể được sử dụng sau một bộ sưu tập."

Bằng cách này, all()any() thực ra là Universal quantifier, ∀() và existential quantifier, ∃(), tương ứng mà bạn có thể nhớ từ lớp toán.

+0

trợ giúp nhiều ... cảm ơn – danbord

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