0

目标

我正在使用带有 C# + ASP.NET MVC 4 的实体框架,并且我的数据库(MySQL)中有一个存储过程。我想在我的视图上显示此过程的结果。

问题:我不知道语法。

我所拥有的:在我的数据库上下文(由实体框架自动生成)中有以下代码:

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)?

提前致谢。

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

更好的方法:

调用 a 中的getProductsListForHome方法ModelBuilder。这样,您的控制器保持干净(永远记住规则:控制器方法不应超过 15 行代码!
以下示例确实使用 IOCIProductBuilder在运行时将 与正确的实现绑定(您不必执行同样,只需直接使用正确的实现即可)

产品控制器

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

一个更好的方法:

调用 a 中的getProductsListForHome方法ProductService对SOC会更好。将ProductController负责返回 amodelview,将负责和返回ProductBuilder的业务/领域对象之间的映射,最后将负责调用方法。ProductServiceviewmodelProductServicegetProductsListForHome

产品控制器

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 回答