4

我想在我的控制器中使用以下模式:

api/{controller}/{id}/{collection}

示例: api/customers/123/addresses

但我想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 Serializer 的函数。所以你有几个选择。

  1. 切换到支持您想要的替代 xml 序列化程序。
  2. 切换到一种绕过相关序列化程序的输出形式(例如使用 JSON.net 的 JSON)
  3. 教数据契约序列化器如何使用

对于“教学”选项,您可以通过两种方式进行教学。

(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 回答