MVC5加EF6 执行存储过程 获取表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVC5加EF6 执行存储过程 获取表相关的知识,希望对你有一定的参考价值。

class Program

static void Main(string[] args)

using (var oDataContext = new WXQP2015Entities())//EF对应的上下文对象

ObjectResult<zty_ABMXSFX_Result> a = oDataContext.zty_ABMXSFX(Convert.ToDateTime("2015-05-05"), Convert.ToDateTime("2015-05-05"));
Console.WriteLine(a);

Console.ReadKey();


我想输出一个表集合怎么实现的 或者实体集合
用的ADO实体数据模型把SERVER2008数据库的存储过程勾上了
oDataContext.zty_ABMXSFX 这句话是什么意思 zty_ABMXSFX这个是我的存储过程
执行的一个查询语句 需要两个变量时间

参考技术A zty_ABMXSFX 应该是你数据库里面对应的存储过程

EF会把存储过程映射为上下文中的一个方法, 起返回值为存储过程中SELECT出来的值或结果集合追问

zty_ABMXSFX 是我的存储过程
oDataContext.zty_ABMXSFX(Convert.ToDateTime("2015-05-05"), Convert.ToDateTime("2015-05-05"));

这个不是EF自动生成的方法吗
但是不知道返回这个是什么意思
怎么才能select 出值或者结果呢?

在 MVC 视图中显示存储过程的结果 (EF 5 / MVC 4)

【中文标题】在 MVC 视图中显示存储过程的结果 (EF 5 / MVC 4)【英文标题】:Displaying results of a Stored Procedure in MVC View (EF 5 / MVC 4) 【发布时间】:2013-06-08 17:19:23 【问题描述】:

目标

我想在我的视图中显示存储过程的结果。

问题

Entity Framework 自动为我导入了一个执行过程的方法,但是我没有得到我期望在屏幕上显示的结果。

导入的函数是:

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

我已经尝试过的

在 ProductsController 上:

//
// GET: /Products/
public ActionResult Index()

    ObjectResult<getProductsListForHome_Result> products = db.getProductsListForHome(1, 14);
    return View(products.ToList());

使用前面的代码,当我访问 http://myapp.com/Products/ 时,我收到以下消息:

传入字典的模型项是类型 'System.Collections.Generic.List1[MyApp.Models.getProductsListForHome_Result]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1[MyApp.Models.bm_products]'。

我该怎么做才能解决这个问题?

【问题讨论】:

你需要知道的都在错误信息中,你应该能从错误信息中弄清楚。 你好,@DGibbs。感谢您的提示(?),但我是初学者,我仍然不能用自己的脚走路,所以我请求帮助。 【参考方案1】:

第一个,写得很好的问题!

这是一个类型转换问题,看起来你的答案是这里接受的答案:

MVC: The model item passed into the dictionary is of type X, but this dictionary requires a model item of type X

【讨论】:

非常感谢——您的链接对我非常有用,因为它阐明了视图也参与了这个过程。【参考方案2】:

你的 View 很可能是一个强类型的,它被声明为

@model System.Collections.Generic.IEnumerable<MyApp.Models.bm_products>

但是你在控制器中传递了一个不同的类型,并且遇到了错误。

你可以做什么:

    为视图指定另一种类型。视图本身可能需要在此之后进行一些重构:

    @model System.Collections.Generic.IEnumerable<MyApp.Models.getProductsListForHome_Result>
    

    首选。在控制器中运行一些代码,将 SP 返回的集合转换为 View 可以使用的东西:

    public ActionResult Index()
    
        ObjectResult<getProductsListForHome_Result> products = db.getProductsListForHome(1, 14);
    
        List<bm_products> viewProducts = products.Select(p => new bm_productsProductName = p.Name, ProductPrice = p.Price).ToList();
    
        return View(viewProducts);
    
    

【讨论】:

哇!差不多了!如何设置属性? @chiefGui,使用语法示例进行编辑。左手是bm_products 类的属性,右手是getProductsListForHome_Result 的属性。查看object initializers in C# 以获得更好的理解。 哦,谢谢@Andrei!只是想问一下,Entity Framework + Stored Procedures 有一些限制,对吧?一种是用于自定义列名,继续吗?我问这个是因为我的程序正在获取表格的最高和最低价格,然后我创建了两列(按程序),称为“minProductPrice”和“maxProductPrice”,它们在表格中不存在。最后一个问题:“p”变量没有找到任何属性。 @chiefGui,每段代码都有其局限性。如果我正确理解你的情况,这里没有限制。 EF 使用类模型与 DB 一起工作,因此如果您创建一个具有相应属性的类,或者让 EF 为您生成一个类 - 您可以安全地使用返回不存在列的存储过程。 知道了!那么,如何将“min/maxProductPrice”设置为属性? bm_products 的表中没有这样的列。

以上是关于MVC5加EF6 执行存储过程 获取表的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6 中具有多个记录集的存储过程

一个存储过程中更新多个表可以用一个COMMIT吗 ?

SQL 2005 存储过程结果集的 ODBC 执行/获取不能使用表 @variable

SQLserver利用存储过程新加一行,id设为自动增长,结果运行后没有显示结果,ID增长了,其他信息没有存进

如何获取雪花中执行存储过程的名称?

SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?