Jas*_*ele 7 odata asp.net-web-api
我正在使用http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/working-with-entity-relations上的OData示例项目.在Get我希望能够更改EntitySetController的QueryOptions中的Filter:
public class ProductsController : EntitySetController<Product, int>
{
ProductsContext _context = new ProductsContext();
[Queryable(AllowedQueryOptions=AllowedQueryOptions.All)]
public override IQueryable<Product> Get()
{
var products = QueryOptions.ApplyTo(_context.Products).Cast<Product>();
return products.AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)
我希望能够找到专门提到的属性.我可以通过解析this.QueryOptions.Filter.RawValue属性名称来做到这一点,但我无法更新RawValue它,因为它是只读的.然而,我可以FilterQueryOption从修改后创建另一个实例,RawValue但我无法将其分配给它,this.QueryOptions.Filter因为它也是只读的.
我想我可以调用新过滤器ApplyTo传递它_context.Products,但后来我需要单独调用like 和ApplyTo的其他属性.有没有比这更好的解决方案?QueryOptionsSkipOrderBy
更新
我尝试了以下方法:
public override IQueryable<Product> Get()
{
IQueryable<Product> encryptedProducts = _context.Products;
var filter = QueryOptions.Filter;
if (filter != null && filter.RawValue.Contains("Name"))
{
var settings = new ODataQuerySettings();
var originalFilter = filter.RawValue;
var newFilter = ParseAndEncyptValue(originalFilter);
filter = new FilterQueryOption(newFilter, QueryOptions.Context);
encryptedProducts = filter.ApplyTo(encryptedProducts, settings).Cast<Product>();
if (QueryOptions.OrderBy != null)
{
QueryOptions.OrderBy.ApplyTo<Product>(encryptedProducts);
}
}
else
{
encryptedProducts = QueryOptions.ApplyTo(encryptedProducts).Cast<Product>();
}
var unencryptedProducts = encryptedProducts.Decrypt().ToList();
return unencryptedProducts.AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)
它似乎正在努力到一定程度.如果我设置断点,我可以在unencryptedProducts列表中看到我的产品,但是当方法返回时,我没有得到任何项目.我尝试[Queryable(AllowedQueryOptions=AllowedQueryOptions.All)]重新开启,但没有效果.任何想法为什么我没有得到物品?
更新2
我发现我的查询被应用了两次,即使我没有使用该Queryable属性.这意味着即使我有要返回的项目,也会使用未加密的值查询List,因此没有返回任何值.
我试过用一个ODataController代替:
public class ODriversController : ODataController
{
//[Authorize()]
//[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public IQueryable<Products> Get(ODataQueryOptions options)
{
Run Code Online (Sandbox Code Playgroud)
这工作了!这是否表明存在错误EntitySetController?
小智 4
您可能需要重新生成 ODataQueryOptions 才能解决您的问题。假设您想修改以添加 $orderby,您可以这样做:
string url = HttpContext.Current.Request.Url.AbsoluteUri;
url += "&$orderby=name";
var request = new HttpRequestMessage(HttpMethod.Get, url);
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Product>("Product");
var options = new ODataQueryOptions<Product>(new ODataQueryContext(modelBuilder.GetEdmModel(), typeof(Product)), request);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10574 次 |
| 最近记录: |