排除 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);
}
我正在使用 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);
}