[英]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
返回到view
, ProductBuilder
將負責由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.