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
it を渡しますが、その後、 likeおよびの他のプロパティの_context.Products
を個別に呼び出す必要があります。これよりも良い解決策はありますか?ApplyTo
QueryOptions
Skip
OrderBy
アップデート
私は次のことを試しました:
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
か?