12

ASP.NET WebAPI プロジェクトがあります。最近、すべてのデータ テーブルに対して EntityFramework エンティティを作成しました。しかし、データレイヤーとスキーマをユーザーに公開したくありません。API が OData をサポートするように、エンティティを ViewModel (automapper?) にマップし、IQueryable の戻り値の型を提供するにはどうすればよいですか?

OData は、クエリ構成と SQL に似たパラメーターをサポートしています。クエリ構成部分にある種の双方向変換を提供する必要があると思いますか? それはカスタム LINQ プロバイダーを意味しますか? それよりも簡単だと思います。

または、IQueryable/OData をあきらめるべきですか?

4

3 に答える 3

12

ここで答えを見つけました: Web API Queryable - How to apply AutoMapper?

を使用する代わりに[Queryable]、型のパラメーターを使用して、ODataQueryOptions<T>任意の型または LINQ クエリに対して OData 操作を適用できます。AutoMapper を使用する必要さえない素晴らしい例を次に示します。

public virtual IQueryable<PersonDto> Get(ODataQueryOptions<Person> odataQuery){
    odataQuery.Validate(new ODataValidationSettings(){
        AllowedFunctions = AllowedFunctions.AllMathFunctions
    });
    var people = odataQuery.ApplyTo(uow.Person().GetAll());
    return ConvertToDtos(people);
}

これは、この使用法の詳細を説明している Microsoft のページです。(半分くらい下ったところ)

于 2013-03-05T17:53:13.830 に答える
6

ViewModelクラスを使用してこれを正常にテストすることができました。

public class InvoiceViewModel
{
    public int InvoiceID { get; set; }
    public string InvoiceNumber { get; set; }
}

Getで、エンティティからビューモデルを選択します。

public override IQueryable<InvoiceViewModel> Get()
    {
        var ctx = new CreditPointEntities();
        return ctx.Invoices.Select(i => new InvoiceViewModel
            {
                InvoiceID = i.InvoiceID,
                InvoiceNumber = i.InvoiceNumber
            }).AsQueryable();
    }

webapiconfig.csのmodelbuilder行でviewmodelを使用していることを確認してください

modelBuilder.EntitySet<InvoiceViewModel>("Invoice");

これで、次のようなURLを使用できます

http://website/odata/Invoice?$filter=InvoiceID eq 1

sqlプロファイラーを介して、フィルターがSQLに渡されていることを確認しました。

于 2013-03-01T09:29:00.427 に答える
1

Automapper を使用している場合は、プロジェクションを使用できます。例:

    public class ProductsController : EntitySetController<Product, int>
    {
         private DbProductsContext _db = new DbProductsContext();

         public override IQueryable<ProductDto> Get()
         {
            return _db.Products.Project().To<ProductDto>();
         }
    ...
于 2013-02-21T17:34:50.057 に答える