2015-09-03 65 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