簡體   English   中英

從Entity Framework傳遞過程結果到視圖

[英]Passing result of procedure from Entity Framework to view

目標

我正在使用帶有C#+ ASP.NET MVC 4的實體框架,並且在數據庫(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的方法,它帶有兩個參數。 我要執行此過程,然后在我的視圖上顯示結果。

我必須將結果通過控制器(MVC)傳遞,還是直接從模型傳遞到視圖(MVVM)?

提前致謝。

快速而骯臟的方式:

在您的控制器中調用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);
}

更好的方法:

ModelBuilder調用getProductsListForHome方法。 這樣,您的控制器就可以保持干凈(始終記住規則: 控制器方法不應超過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;
}

更好的方法:

ProductService調用getProductsListForHome方法。 對於SOC會更好。 ProductController將負責將model返回到viewProductBuilder將負責由ProductService返回的業務/領域對象與viewmodel之間的映射,最后, ProductService將負責調用getProductsListForHome方法。

產品控制器

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

如果將其復制粘貼到項目中,則該代碼顯然可能無法編譯。 它的目的是向您展示處理這種情況的不同方法!

我認為您正在尋找 DbContext.DataBase.SqlQuery()

創建一個原始SQL查詢,該查詢將返回給定泛型類型的元素。 該類型可以是具有與查詢返回的列名相匹配的屬性的任何類型,也可以是簡單的原始類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM