运行查询{{odata-url-prefix}}/ArquivosVenda(2)?$expand=Vendas
时会生成错误:
{
"odata.error": {
"code": "",
"message": {
"lang": "en-US",
"value": "An error has occurred."
},
"innererror": {
"message": "Argument types do not match",
"type": "System.ArgumentException",
"stacktrace": " at System.Web.Http.ApiController.<InvokeActionWithExceptionFilters>d__1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()"
}
}
}
我注意到使用$expand
时发生错误;
{{odata-url-prefix}}/ArquivosVenda(2)
和{{odata-url-prefix}}/ArquivosVenda(2)/Vendas
的查询通常会运行,只有$expand
的查询才会出现此问题。
域
public class ArquivoVenda: IAuditavel, IEntidade
{
public virtual int Id { get; set; }
public virtual string FileName { get; set; }
public virtual ICollection<Venda> Vendas { get; set; }
}
public class Venda : IAuditavel, IEntidade
{
public virtual int Id { get; set; }
public virtual DateTime Data { get; set; }
public virtual string GSM { get; set; }
public virtual string Plano { get; set; }
}
控制器
[Authorize]
public abstract class BaseEntidadeController<TEntidade> : ODataController
where TEntidade : class, IEntidade
{
protected IRepositorio<TEntidade> Repositorio { get; private set; }
public BaseEntidadeController(IRepositorio<TEntidade> repositorio)
{
Repositorio = repositorio;
}
[HttpGet, Queryable(AllowedQueryOptions = AllowedQueryOptions.All, PageSize = 25, MaxExpansionDepth = 3)]
public IQueryable<TEntidade> Get()
{
return Repositorio.All();
}
[Queryable(MaxExpansionDepth = 3)]
public virtual SingleResult<TEntidade> Get([FromODataUri]int key)
{
return SingleResult.Create<TEntidade>(Repositorio.Query(c => c.Id == key));
}
[HttpGet]
protected virtual TEntidade GetEntityByKey(int key)
{
return Repositorio.All().FirstOrDefault(p => p.Id == key);
}
}
public class ArquivosVendaController : BaseEntidadeController<ArquivoVenda>
{
public ArquivosVendaController(IArquivosVendaRepositorio repositorio)
: base(repositorio)
{ }
public IQueryable<Venda> GetVendas([FromODataUri] int key)
{
return Repositorio.Get(key).Vendas.AsQueryable();
}
}
WebApi配置
...
var arquivoVenda = modelBuilder.EntitySet<ArquivoVenda>("ArquivosVenda");
arquivoVenda.EntityType.HasKey(p => p.Id);
var venda = modelBuilder.EntitySet<Venda>("Vendas");
venda.EntityType.HasKey(p => p.Id);
...