排除 Azure MobileService TableController 中的列

Exclude Column in Azure MobileService TableController

我正在使用 Azure MobileServices 编写 WindowsPhone 应用程序,并希望使用 TableControllers 将数据库公开给客户端。

public IQueryable<Activity> GetAllActivities()
{
    return Query();
}

但是如何将我的控制器 returns 的数据过滤到客户端? 我已经发现,我可以使用 Where(..).

过滤行

但是有没有办法从结果集中排除列?

提前致谢!

有两种方法,但取决于要求:

1 - 使用与模型映射的特定 dtos

您可以创建与 Azure 移动服务中的模型映射的 Dto,并且该模型与数据库连接。 Dtos 不需要公开我所有的模型,比如

我可以

public class MyDto
{
  public string Name {get;set;}
} 

我的模型可以

public class MyModel
{
   public string Name {get;set;}

   public string Details {get;set;}
} 

然后需要映射它们,在 Azure 移动服务中通常我们使用 AutoMapper

2 - 使用 Linq

中的方法 "Select"

在客户端应用程序中,您可以执行类似

的操作
_client.GetTable<YourObject>().Select(x => new YourObject()
{
    Prop1 = x.Prop1,
    Prop2 = x.Prop2,
}

当您需要进行查询时,您应该使用 Linq。

一个不错的选择是覆盖您的 EntityDomainManager。

我的意思是创建一个新的 class 例如调用它 KhosroItemDomainManager

public class KhosroItemDomainManager : MappedEntityDomainManager<YourModelHere, YourEntityHere>
{
    public KhosroItemDomainManager(DbContext context, 
        System.Net.Http.HttpRequestMessage request, ApiServices services): base(context, request, services)
    { }

    public override IQueryable<YourModelHere> Query()
    {
        MobileServiceContext ctx = this.Context as MobileServiceContext;

        var items = from ai in ctx.YourModelHere
            select new AuctionItem
            {
                Name = ai.Name,
                Description = ai.Description,

            };

        return items;
    }

    public override System.Web.Http.SingleResult<YourModelHere> Lookup(string id)
    {
        var ctx = Context as MobileServiceContext;
        var item = from ai in ctx.AuctionItems
                   where ai.Id == id
                   select new AuctionItem
                   {
                       Id = ai.Id,
                       Description = ai.Description,

                   };

        return new System.Web.Http.SingleResult<YourModelHere>(item);
    }

    public override Task<bool> DeleteAsync(string id)
    {
        return base.DeleteItemAsync(id);
    }
    public override Task<YourModelHere> UpdateAsync(string id, System.Web.Http.OData.Delta<YourModelHere> patch)
    {
        return base.UpdateEntityAsync(patch, id);
    }


}

就这么简单,基本上,您需要做的就是创建自己的域管理器。并覆盖 Query、Lookup、DeleteAsync 和 UpdateAsync

之后你需要回到你的控制器并将这部分替换为

 protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);
        MobileServiceContext context = new MobileServiceContext();
        DomainManager = new EntityDomainManager<YourModelHere>(context, Request,       Services);
    }

 protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);
        MobileServiceContext context = new MobileServiceContext();
        DomainManager = new KhosroItemDomainManager(context, Request, Services);
    }