gpt4 book ai didi

asp.net-web-api - 修改 WebAPI OData QueryOptions.Filter 的最佳方式

转载 作者:行者123 更新时间:2023-12-03 14:57:27 25 4
gpt4 key购买 nike

我在 http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/working-with-entity-relations 使用 OData 示例项目.在 Get 中,我希望能够更改 EntitySetController 的 QueryOptions 中的过滤器:

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();
}

我希望能够找到特别提到的属性。我可以通过解析 this.QueryOptions.Filter.RawValue 来做到这一点对于属性名称,但我无法更新 RawValue因为它是只读的。但是,我可以创建 FilterQueryOption 的另一个实例来自修改后的 RawValue但我无法将其分配给 this.QueryOptions.Filter因为这也是只读的。

我想我可以调用新过滤器的 ApplyTo通过它 _context.Products ,但是我需要单独调用 ApplyTo QueryOptions 的其他属性喜欢 SkipOrderBy .还有比这更好的解决方案吗?

更新

我尝试了以下方法:
    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();
}

它似乎正在发挥作用。如果我设置断点,我可以在 unencryptedProducts 中看到我的产品列表,但是当方法返回时,我没有得到任何项目。我试着把 [Queryable(AllowedQueryOptions=AllowedQueryOptions.All)]再次打开,但没有任何效果。有什么想法为什么我没有收到元素?

更新 2

我发现我的查询被应用了两次,即使我没有使用 Queryable属性。这意味着即使我有要返回的项目列表正在使用未加密的值进行查询,因此没有返回任何值。

我尝试使用 ODataController反而:
public class ODriversController : ODataController
{

//[Authorize()]
//[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public IQueryable<Products> Get(ODataQueryOptions options)
{

这有效!这是否表明 EntitySetController 中存在错误? ?

最佳答案

您可能需要重新生成 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);

关于asp.net-web-api - 修改 WebAPI OData QueryOptions.Filter 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16440644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com