Я пытаюсь создать MediaTypeFormatter
для обработки text/csv
, но при запуске нескольких проблем при использовании $expand
в запросе OData.
Query:
http://localhost/RestBlog/api/Blogs/121?$expand=Comments
Контроллер:
[EnableQuery]
public IQueryable<Blog> GetBlog(int id)
{
return DbCtx.Blog.Where(x => x.blogID == id);
}
В текстовом формате:
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 }
);
}
Обратите внимание, что тип value
равен System.Data.Entity.Infrastructure.DbQuery<System.Web.Http.OData.Query.Expressions.SelectExpandBinder.SelectAllAndExpand<Rest.Blog>>
, что означает, что он не работает.
Тип value
должен быть IQueryable
, но после кастования он возвращает null
.
При выполнении запроса без $expand
все работает намного разумнее. Что я делаю неправильно?
Я просто пытаюсь получить данные перед тем, как вывести их как CSV, поэтому руководство будет с большой благодарностью.