4

コントローラーで次のパターンを使用したい:

api/{コントローラ}/{id}/{コレクション}

例: api/顧客/123/アドレス

IQueryable Of Tしかし、対応する Get アクションから戻りたいです。私はこのようなものが欲しいです(簡略化):

public IQueryable<????> GetCollection(int id, string collection)  
{  
    switch(collection)  
    {  
        case "addresses":  
            return _addresses.AsQueryable();  
            break;  
        case "orders":  
            return _orders.AsQueryable();  
            break;  
        default:  
            throw new Exception(NotSupported);  
    }  
}   

これはできますか?
推奨されるアプローチは何ですか?

4

3 に答える 3

6

@SLacksは、返す必要があるか、できる場合は正しい IQueryable<object>ですIQueryable<someBaseType>

取得するエラーは、DataContract シリアライザーの機能です。したがって、いくつかのオプションがあります。

  1. 必要なものをサポートする別の xml シリアライザーに切り替えます。
  2. 問題のシリアライザーをバイパスする出力形式に切り替えます (JSON.net を使用した JSON など)。
  3. を使用してオブジェクトをシリアル化する方法をデータ コントラクト シリアライザーに教えます。

「教える」オプションでは、2 つの方法で教えることができます。

(A)属性を活用し[KnownType(typeof(...))]ます。ここに属性に関する投稿がありKnownTypeます。これは WCF 用ですが、開始する必要があります。

(B)データ コントラクト リゾルバーを使用する。この投稿から始めることができます

于 2012-05-30T22:54:38.350 に答える
3

@Ebarrが言ったことを拡張すると、これを達成する最も簡単な方法は、この方法で返すことができるようにしたいさまざまなクラスを更新し、それらを共通の基本クラスまたはインターフェースから継承させることです。

例:

[KnownType(typeof(Address))]
[KnownType(typeof(Order))]
public abstract class _BaseObject { }

public partial class Address : _BaseObject { }
public partial class Order : _BaseObject { }

これで、コントローラー メソッドを次のようにすることができます。

public IQueryable<_BaseObject> GetCollection(int id, string collection) {  
    switch(collection) {  
        case "addresses":  
            return _addresses.AsQueryable();
        case "orders":  
            return _orders.AsQueryable();
        default:  
            throw new NotSupportedException();  
    }  
}

[KnownType]属性が にあることに注意してくださいSystem.Runtime.Serialization。また、このメソッドはシリアライゼーションに関して期待するとおりの結果になることにも注意してください。JSONただし、XMLシリアライゼーションは通常、オブジェクトをサブクラスではなく基本クラスとして表示するタグになります (それが返されたものであるため)。

于 2012-12-20T18:51:47.007 に答える
0

非ジェネリックを返すだけIQueryableです。
またはIQueryable<object>共分散を介して。

于 2012-04-11T20:53:34.977 に答える