使用$ expand时的Web API OData媒体类型格式化程序

gee*_*yUK 27 c# linq entity-framework odata asp.net-web-api

我正在尝试创建一个MediaTypeFormatter处理text/csv$expand在OData查询中使用时遇到一些问题.

查询:

http://localhost/RestBlog/api/Blogs/121?$expand=Comments
Run Code Online (Sandbox Code Playgroud)

控制器:

[EnableQuery]
public IQueryable<Blog> GetBlog(int id)
{
    return DbCtx.Blog.Where(x => x.blogID == id);
}
Run Code Online (Sandbox Code Playgroud)

在我的媒体类型格式化程序中:

private static MethodInfo _createStreamWriter =
        typeof(CsvFormatter)
        .GetMethods(BindingFlags.Static | BindingFlags.NonPublic)
        .Single(m => m.Name == "StreamWriter");

internal static void StreamWriter<T, X>(T results)
{
    var queryableResult = results as IQueryable<X>;
    if (queryableResult != null)
    {
        var actualResults = queryableResult.ToList<X>();
    }
}

public override void WriteToStream(Type type, object value,
    Stream writeStream, HttpContent content)
{
    Type genericType = type.GetGenericArguments()[0];
    _createStreamWriter.MakeGenericMethod(
               new Type[] { value.GetType(), genericType })
                .Invoke(null, new object[] { value }
       );
}
Run Code Online (Sandbox Code Playgroud)

请注意,类型valueSystem.Data.Entity.Infrastructure.DbQuery<System.Web.Http.OData.Query.Expressions.SelectExpandBinder.SelectAllAndExpand<Rest.Blog>>表示它不起作用.

value应该是类型,IQueryable但在铸造它返回null.

在没有$expand事情的情况下进行查询时更合理.我究竟做错了什么?

我只想在输出为CSV之前尝试获取数据,因此非常感谢指导.

Sør*_*sen 7

SelectExpandBinder.SelectAllAndExpand是的子类SelectExpandWrapper它实现IEdmEntityObject和ISelectExpandWrapper.使用ISelectExpandWrapper.ToDictionary方法,您可以获取底层实体的属性.这是从SelectExpandWrapperConverter可以看到对象被序列化为JSON的方式.