TableController和Odata查询

时间:2015-09-03 07:49:41

标签: azure asp.net-web-api odata

在一个小型Azure移动应用程序中,我在tablecontroller中使用了以下GET方法:

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

使用以下REST调用,我可以使用lastname ='Tiger'

查询用户
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'

我收到了“错误请求”错误....

我怎样才能做到这一点......

任何帮助都将非常感谢....

2 个答案:

答案 0 :(得分: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 to Entities。

答案 1 :(得分:0)

你的帖子帮我解决了自己的问题!

据我所知,它不起作用,因为当你使用DTO对象和MappedEntityDomainManager时,this.Query()调用崩溃了。就我而言,我的Model和DTO对象都继承自Azure.Mobile.Server.EntityData。

基本上......使用MappedEntityDomainManager避免this.Query()

试试这个:

$conn = new PDO("mysql:host=".$mysql_host.";dbname=".$mysql_bd, $mysql_user, $mysql_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec($sql);

其中_context是您的DBContext而.User是您的用户DBSet