8

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別のインスタンスを作成できますが、これも読み取り専用であるため、割り当てることはできません。FilterQueryOptionRawValuethis.QueryOptions.Filter

新しいフィルターを呼び出すことができると思いますApplyToit を渡しますが、その後、 likeおよびの他のプロパティの_context.Productsを個別に呼び出す必要があります。これよりも良い解決策はありますか?ApplyToQueryOptionsSkipOrderBy

アップデート

私は次のことを試しました:

    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属性を使用していないにもかかわらず、クエリが 2 回適用されていることがわかりました。これは、返すアイテムがあったにもかかわらず、リストが暗号化されていない値でクエリされていたため、値が返されなかったことを意味します。

代わりに使用してみましODataControllerた:

public class ODriversController : ODataController
{

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

そしてこれはうまくいきました!これは にバグがあることを示していますEntitySetControllerか?

4

1 に答える 1