[英]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.