2015-09-03 134 views
1

在一个小天青移动应用,我有一个tablecontroller以下GET方法:使用以下REST呼叫TableController和ODATA查询

public IQueryable<User> GetAllUser() 
    { 
     return Query(); 
    } 

,我可以查询用户姓氏=“虎”

GET: ~/userinfo?$filter=lastName%20eq%20'Tiger' 

现在我想一个组织字段添加到我的用户,所以我已经改变了GET方法:

public IQueryable<UserDto> GetAllUser() 
    { 
     return Query().Select(u => new UserDto{FirstName=u.FirstName, LastName=u.LastName, Organisation="Acme"}); 
    } 

但现在,当我尝试查询我的用户,使用相同的过滤器:

GET: ~/userinfo?$filter=lastName%20eq%20'Tiger' 

我得到一个“错误的请求”的错误....

我怎样才能使这项工作...

任何帮助,将不胜感激....

+0

有你改变了功能GetAllUser的定义? –

回答

1

尝试:

public IQueryable<UserDto> GetAll() 
{ 
    return Query().AsEnumerable().Select(u => 
      new UserDto 
      { 
       FirstName = u.FirstName, 
       LastName = u.LastName, 
       Organisation = "Acme" 
      }).AsQueryable(); 
} 

ODATA查询将用于DTO而不是实体。

您的控制器应仍然使用TableController<User>

你也可以使用AutoMapper和简单地做:

return Query().ProjectTo<UserDTO>();

这将做LINQ到实体。

0

你的文章帮我解决了我自己的问题!

从我可以告诉,它不会因为当你使用DTO对象和MappedEntityDomainManager,this.Query()调用崩溃工作。在我的情况下,我的Model和DTO对象从Azure.Mobile.Server.EntityData继承。

...基本上避免this.Query()与MappedEntityDomainManager

试试这个:

public IQueryable<UserDto> GetAllUser() 
{ 
    return _context.User.Select(u => new UserDto{FirstName=u.FirstName, LastName=u.LastName, Organisation="Acme"}); 
} 

其中_context是你的DbContext和。用户是你的用户DBSet