2013-01-18 42 views
5

Tôi đang sử dụng ASP.Net WebAPI Nightly mới nhất (ngày 2013-01-16).Trả về các phần tử con trong ASP.NET WebAPI OData

Tôi có một mô hình cơ sở dữ liệu EF đơn giản đầu tiên tại thời điểm có hai thực thể - Bệnh nhân và Số lần truy cập. Mỗi bệnh nhân có thể có nhiều lần thăm khám.

Tôi muốn có thể truy vấn danh sách bệnh nhân của mình và có các thực thể truy cập cho từng bệnh nhân được trả về nội tuyến. Tôi biết rằng việc triển khai OData của WebAPI chưa hỗ trợ $ mở rộng. Tôi hy vọng rằng điều đó chỉ có nghĩa là mở rộng được điều khiển bởi máy khách tùy chọn không được hỗ trợ và tôi có thể buộc phải mở rộng phía máy chủ.

Hiện tại tôi không nhận được bất kỳ lượt truy cập nào trong nội tuyến.

Ví dụ,) Nhận() phương pháp (PatientController tôi trông giống như

[Queryable(AllowedQueryOptions=AllowedQueryOptions.Supported)] 
public override IQueryable<Patient> Get() 
{ 
    var query = this.entities.Patients.Include("Visits"); 
    return query; 
} 

tôi đã xác minh rằng các truy vấn thực hiện đối với cơ sở dữ liệu của tôi không thực sự bao gồm các thông tin truy cập.

Để sử dụng dịch vụ OData có sẵn công khai làm ví dụ, nếu bạn sử dụng dịch vụ tại http://services.odata.org/OData/OData.svc/, bạn có thể nhận danh sách Nhà cung cấp. Đây là http://http://services.odata.org/OData/OData.svc/Suppliers. Bạn cũng có thể yêu cầu danh sách các nhà cung cấp bao gồm danh sách sản phẩm sử dụng http://http://services.odata.org/OData/OData.svc/Suppliers?$expand=Products

Bước qua mã ASP.NET (qua máy chủ ký hiệu) Tôi đã truy cập vào System.Web.Http.OData.Formatter .Serialization.ODataEntityTypeSerializer và có thể thấy rằng đó là phương thức CreatePropertyBag, để xây dựng danh sách các thuộc tính được tuần tự hóa, không bao gồm các thuộc tính điều hướng và dường như chúng không được liệt kê ở bất kỳ đâu ngoài việc được viết ra như NavigationLinks .

Tôi khá mới trong thế giới ASP.NET nói chung và đã dành một tuần để thu hút đầu óc xung quanh cách thức hoạt động (đặc biệt với những thay đổi được thực hiện cho OData vào cuối năm 2012 và những thay đổi khác được thực hiện đến năm 2013).

Tôi nghi ngờ rằng nếu ODataEntityTypeSerializer được sửa đổi (tôi rất vui khi thử) để nhúng thông tin bổ sung này vào vị trí thích hợp (trong mỗi liên kết điều hướng dưới dạng nguồn cấp nội tuyến lồng nhau như tốt nhất tôi có thể biết) thì tôi ' d được đặt.

Câu hỏi:

  1. Tôi có bỏ qua một cái gì đó rõ ràng và có một lá cờ tôi có thể thiết lập để bật hành vi này? Tôi có thể thấy lý do tại sao, nếu một lá cờ như vậy tồn tại, nó sẽ bị tắt theo mặc định (tải xuống bằng EF và cờ này sẽ không hoạt động tốt)

  2. Nếu # 1 là không, có một số ODataEntityTypeSerializer khác mà tôi có thể sử dụng? Nếu vậy, làm thế nào để chuyển sang nó?

  3. Nếu # 2 là không, bất kỳ gợi ý nào về nơi tôi nên bắt đầu viết của riêng mình? Có một nơi tôi có thể thay thế trong serializer của riêng tôi hay tôi phải duy trì dự án Extensions của ASP.NET của tôi (trái ngược với dự án Runtime)

Cảm ơn rất nhiều!

+1

Tôi có vấn đề ngược lại ... con thực thể của tôi là luôn luôn bao gồm mặc dù tôi không có gọi là phương pháp Include và chỉ định nó theo cách này. Tôi đang sử dụng serializer JSON.Net mặc dù vậy điều này có thể làm cho sự khác biệt ... –

Trả lời

3

Mở rộng $ rất cao trong danh sách những thứ hỗ trợ OData của chúng tôi. Nhưng theo như tôi biết, chúng tôi không có bất kỳ cờ nào để bật nó ở phía máy chủ. Trình định dạng hiện không cho phép bạn thay thế trình tuần tự của riêng bạn.Vì vậy, tôi sợ lựa chọn duy nhất của bạn trong thời gian chờ đợi là tạo một ngã ba và thêm hỗ trợ cho $ mở rộng. Nếu bạn quản lý để làm cho nó làm việc, xin vui lòng xem xét việc gửi một yêu cầu pull cách của chúng tôi:

http://aspnetwebstack.codeplex.com/SourceControl/network

+0

Cảm ơn câu trả lời của bạn Youssef. Tôi không chắc mình có đủ quen thuộc với mọi thứ trong codebase ASP.NET để thực hiện mở rộng $ của riêng tôi hay không, nhưng tôi có thể có một vết nứt khi định dạng tùy ý theo các thuộc tính điều hướng và nhúng chúng vào trong - một loại người nghèo hardcoded mở rộng. Tôi không có ý tưởng nếu đó là khó khăn hoặc dễ dàng nhưng tôi sẵn sàng thử, đặc biệt là nó sẽ làm cho dự án của tôi dễ dàng hơn nhiều nếu nó có thể. –

+0

để chức năng này không có trong Microsoft.AspNet.WebApi.OData 4.0.1 phát hành vào cuối tháng 3? không có bản phát hành nào kể từ đó? –

+0

Simon, chúng tôi đã thêm hỗ trợ $ select và $ expand cho các bản dựng hàng đêm của chúng tôi nếu bạn sẵn sàng sử dụng chúng. Bạn có thể tìm hiểu thêm về cách sử dụng các bản dựng hàng đêm đó tại đây: http://blogs.msdn.com/b/henrikn/archive/2012/06/01/using-nightly-asp-net-web-stack-nuget-packages-with -vs-2012-rc.aspx –

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