2012-05-02 14 views
5

AtomまたはRSSフィードを返すASP.NET Web APIアプリケーションを構築しています。これを行うには、System.ServiceModel.Syndication.SyndicationFeedを作成し、SyndicationFeedAtom10FeedFormatterまたはRss20FeedFormatterに変換し、その結果を応答ストリームにストリーミングすることで、HTTP受諾ヘッダーの処理を担当するカスタムMediaTypeFormatterを作成します。ここまでは順調ですね。ODataクエリとASP.NET Web APIのIQueryable以外のタイプ

私のコントローラは、このようなものになります。

 
    public class FeedController : ApiController 
    { 
     public HttpResponseMessage Get() 
     { 
      FeedRepository feedRepository = new FeedRepository(); 
      HttpResponseMessage<SyndicationFeed> successResponseMessage = new HttpResponseMessage<SyndicationFeed>(feedRepository.GetSyndicationFeed()); 
      return successResponseMessage; 
     } 
    } 

私は何をしたいことを利用することであるが、内蔵のODataは、私のフィードをフィルタリングするために照会が、IQueryable<SyndicationFeed>Get()メソッドの戻り値の型を変更SyndicationFeedIQueryableを実装していないため、明らかに動作しません。

SyndicationFeedIEnumerable<SyndicationItem>プロパティで、組み込みのODataクエリを使用する方法はありますか?

答えて

3

System.Linq名前空間はIEnumerableインターフェイスにAsQueryableという名前の拡張メソッドを提供します。マイクロソフトは、Web APIのベータ版ビルドにあったのODataクエリのための初歩的なサポートを削除するので、この質問は、もはや適切である

public class FeedController : ApiController 
{ 
    public IQueryable<SyndicationFeed> Get() 
    { 
     FeedRepository feedRepository = new FeedRepository(); 

     //TODO: Make sure your property handles empty/null results: 
     return feedRepository.GetSyndicationFeed() 
        .YourEnumerableProperty.AsQueryable(); 
    } 
} 
+0

提案をお寄せいただきありがとうございますが、戻り値の型が間違っているので、それが動作しません:それは意志あなたのケースのためにhttps://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

で チェック「を呼び出すクエリオプション直接」セクションは次のようになります。あなたの例では、IQueryable が必要ですが、IEnumerable を返すでしょう。 SyndicationFeedはIQueryableを実装していませんが、RSSまたはAtomフィードのエンベロープであるため、私はそれを破棄できません。問題は、返される型としてSyndicationFeedを保持したまま、IEnumerable をフィルタリングするODataクエリを取得するにはどうすればいいですか? –

+0

'return syndicationItems.AsQueryable();' –

3

:あなたのコードは、この線に沿って見ていないでしょう。

将来のバージョンでは、より完全なODataサポートが含まれます。 CodePlexとNuGetを介して入手可能な初期のビルドがあり、ここに詳細があります:http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx

+0

あなたはurの質問のための解決策を見つけましたか?私は同様の問題に直面している.... plzは私の質問をチェックし、どのような方法で助けることができる場合は私に知らせるhttp://stackoverflow.com/questions/13451649/how-to-apply-paging-specifically-to-a -list-of-a-json-using-asp-netのリスト – Bitsian

0

ODataで作業する場合、IQuerableをコントローラから返す必要はありません。

public SyndicationFeed Get(ODataQueryOptions<SyndicationItem> opts) 
{ 
    var settings = new ODataValidationSettings(); 

    opts.Validate(settings); 

    SyndicationFeed result = feedRepository.GetSyndicationFeed(); 

    result.Items = opts.ApplyTo(result.Items.AsQuerable()).ToArray(); 

    return result; 
} 
関連する問題