0

目標

C# + ASP.NET MVC 4 で Entity Framework を使用しており、データベース (MySQL) にストアド プロシージャがあります。この手順の結果をビューに表示したいと思います。

問題: 構文がわかりません。

私が持っているもの:データベースコンテキスト(Entity Frameworkによって自動生成)には、次のコードがあります:

public partial class BluMercadosContext : DbContext
{
    public BluMercadosContext()
        : base("name=BluMercadosContext")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    [...]

    public virtual ObjectResult<getProductsListForHome_Result> getProductsListForHome(Nullable<int> inOffer, Nullable<int> categoryId)
    {
        var inOfferParameter = inOffer.HasValue ?
            new ObjectParameter("inOffer", inOffer) :
            new ObjectParameter("inOffer", typeof(int));

        var categoryIdParameter = categoryId.HasValue ?
            new ObjectParameter("categoryId", categoryId) :
            new ObjectParameter("categoryId", typeof(int));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<getProductsListForHome_Result>("getProductsListForHome", inOfferParameter, categoryIdParameter);
    }
}

ご覧のとおりgetProductsListForHome、2 つのパラメーターで呼び出されるメソッドがあります。この手順を実行して、ビューに結果を表示したいと考えています。

結果をコントローラー (MVC) を介して渡すか、モデルからビュー (MVVM) に直接渡す必要がありますか?

前もって感謝します。

4

2 に答える 2

1

手っ取り早い方法:

コントローラーでメソッドを呼び出しgetProductsListForHomeます。

public ActionResult ProductList(SomeType SomeParamIfYouNeed)
{
  using (BluMercadosContext context = new BluMercadosContextEntities())
  {
    ObjectSet<Product> query = context.Products;
    ObjectResult<Product> queryResult = query.Execute(MergeOption.AppendOnly);
  }

  return PartialView("ProductList", queryResult);
}

より良い方法:

getProductsListForHomeでメソッドを呼び出しModelBuilderます。そうすれば、コントローラーはクリーンなままになります (ルールを常に覚えておいてください:コントローラー メソッドは 15 行のコードを超えてはなりません! )
次の例では、IOC を使用してIProductBuilder、実行時に適切な実装でバインドします (実行する必要はありません)。同様に、適切な実装を直接操作するだけです)

製品コントローラー

public ProductController(IProductBuilder productBuilder)
{
  _productBuilder = productBuilder;
}

public ActionResult ProductList(SomeType SomeParamIfYouNeed)
{
  var model = _productBuilder.Get(SomeParamIfYouNeed);

  return PartialView("ProductList", model);
}

プロダクトビルダー

public List<Product> Get (SomeType SomeParamIfYouNeed)
{
  using (BluMercadosContext context = new BluMercadosContextEntities())
  {
    ObjectSet<Product> query = context.Products;
    ObjectResult<Product> queryResult = query.Execute(MergeOption.AppendOnly);
  }

  return queryResult;
}

さらに良い方法:

getProductsListForHomeでメソッドを呼び出しProductServiceます。SOCの方がいいでしょう。はにをProductController返し、はとによって返されたビジネス/ドメイン オブジェクト間のマッピングを担当し、最後にメソッドを呼び出すのはです。modelviewProductBuilderProductServiceviewmodelProductServicegetProductsListForHome

製品コントローラー

public ProductController(IProductBuilder productBuilder)
{
  _productBuilder = productBuilder;
}

public ActionResult ProductList()
{
  var model = _productBuilder.Get();

  return PartialView("ProductList", model);
}

プロダクトビルダー

public ProductBuilder(IProductService productService)
{
  _productService = productService;
}

public List<Product> Get ()
{
  // Rather than returning the _productService method call, you could do some mapping between what is returned and the model your view needs.
  return _productService.GetProducts();
}

製品サービス

public List<Product> GetProducts()
{
  using (BluMercadosContext context = new BluMercadosContextEntities())
  {
    ObjectSet<Product> query = context.Products;
    ObjectResult<Product> queryResult = query.Execute(MergeOption.AppendOnly);
  }

  return queryResult;
}

このコードをコピーしてプロジェクトに貼り付けると、明らかにコンパイルされない可能性があります。その目的は、この種の状況に対処するためのさまざまな方法を示すことです!

于 2013-06-12T09:42:45.543 に答える
0

探していると思います DbContext.DataBase.SqlQuery()

指定されたジェネリック型の要素を返す生の SQL クエリを作成します。この型は、クエリから返される列の名前と一致するプロパティを持つ任意の型にすることも、単純なプリミティブ型にすることもできます。

于 2013-06-10T18:47:47.337 に答える