ASP.NET MVC中的多个记录集
使用MVC的唯一示例只有一个返回的结果集.当使用存储过程时,可以检索多个记录集,并且我们倾向于使用存储过程的全部原因有两个原因(我确信你们中许多人也知道).首先,如果我们需要传递参数,其次如果我们需要多个数据表返回.这在ASP.NET的MVC架构中是如何可能的?
在this tutorial,我们看到如何检索数据.但它使用ViewData.Model,它指示单个结果集,但不能解释如果返回多个结果集会发生什么,或者如何获取它们.
强类型存储过程输出
此外,ASP.NET网站上使用LINQ进行强类型解析输出的示例通过使用* .dbml格式来实现,该格式是表模式的镜像,允许使用LINQ查找字段.大.但是,如果您的输出是从存储过程自定义的,而不直接映射到视图或表,会发生什么?我们如何从这些存储过程中解析列名?
在上一节我描述了this tutorial,但这也只显示如何为表创建LINQ to sql,而不是从sproc创建自定义输出.
LINQ列查找
在工作中,我们运行一个宏,它将一大堆类导出到我们的App_Code文件夹中,以便存储过程参数被预定义.这样做是因为我们不必调用DeriveParameters,它包含对数据库的额外调用.我们不希望发生这种情况,因为它的流量很多.如果我们使用LINQ,列数据类型如何解决?每当我们定义一个参数来查找参数的数据类型和名称时,是否有数据库的调用?有什么变化?它是否每次都调用DeriveParameters?这些缓存在某个地方吗?
DBML格式
* .dbml文件是否包含数据库中的所有表?我们有大约15个数据库,每个数据库中有许多,多个表.
每个输出的视图
还有一点要补充到这个帖子.而不是手动创建dbml类,最好将数据表示为视图,即使它是自定义输出?还是在dbml文件中创建自定义类更好?
这必须是最后的问题,否则我会吃我自己的手臂
“无法将类型为’SingleResult`1 [IntranetMVC.UserDetail]’的对象输入到”IntranetMVC.UserDetail“.
这是功能:
Function Index() As ActionResult ViewData("Message") = "Welcome to ASP.NET MVC!" Dim userDetail As UserDetail Dim office As IList(Of Office) Dim activeUser As IList(Of ActiveUser) Dim dept As IList(Of Department) Using db As PersonnelDataContext = New PersonnelDataContext Dim results As IMultipleResults = db.UserDetail(1168) userDetail = results.GetResult(Of UserDetail)() office = results.GetResult(Of Office)() activeUser = results.GetResult(Of ActiveUser)() dept = results.GetResult(Of Department)() End Using Return View(New IndexViewData(userDetail,office,activeUser,dept)) End Function
它发生在所有userDetail,activeUser和dept分配上,但我不知道为什么.现在,我还没有正确地映射它们,但是以系统为例.我将表模式拖放到dbml文件中,因此它绝对存在,格式正确.
UPDATE
这是我的实际代码.这不是最后的,我一直在玩.看来返回类型是不对的,但我不知道为什么.似乎认为只有当存储过程实际返回四组数据时,才会返回单个结果.其中一个集合只有一个结果,其他集合总是返回多个行:
无法转换类型为’SingleResult1 [IntranetMVC.Office]’的对象键入’System.Collections.Generic.IList1
Imports System.Data.Linq Imports System.Reflection Imports System.Data.Linq.Mapping Partial Class PersonnelDataContext <FunctionAttribute(Name:="dbo.UserDetailProc"),_ ResultType(GetType(UserDetail)),_ ResultType(GetType(IList(Of Office))),_ ResultType(GetType(IList(Of ActiveUser))),_ ResultType(GetType(IList(Of Department)))> _ Public Function UserDetail( _ <Parameter(Name:="User_Key",DbType:="Int")> ByVal User_Key As Integer,_ <Parameter(Name:="EditYN",DbType:="Char")> Optional ByVal EditYN As Char = "N") As IMultipleResults Dim result As IExecuteResult = Me.ExecuteMethodCall(Me,CType(MethodInfo.GetCurrentMethod(),MethodInfo),User_Key,EditYN) Return CType(result.ReturnValue,IMultipleResults) End Function End Class
固定
好的,我没有意识到,因为说实话,我没有正确地检查返回类型.我假设result.GetResult(Of MyType)(来自IMultipleResults)将返回一个集合.相反,它只返回单个结果,并将指针移动到集合中的下一个项目.不幸的是,GetResult是唯一的返回结果的暴露方法,因此您必须遍历该集合并将其添加到通用列表中.
非常感谢!
解决方法
是的 – 最确定的
首先,您需要手动创建一个调用存储过程的方法,返回一个IMultipleResults结果.
This blog posts拥有您所需的所有信息.做的很简单,很容易和工作.
你需要做的是两个步骤.
>创建一个调用存储过程并返回多个记录的方法(参考上面的博文).
>创建在视图中使用的简单类对象,并且控制器设置属性.
例如.
IndexViewData.cs public class IndexViewData { IList<Customers> Customers { get; set; } IList<Products> Products { get; set; } }
.
HomeController.cs public ActionResult Index() { IList<Customers> customers; IList<Products> products; // This grabs the multiple records from a single stored procedure. // This code taken from the blog post link,above. using (NorthwindDataContext db = new NorthwindDatacontext) { IMultipleResults results = db.GetMultipleRecordSets(arg1,....); customers = results.GetResult<Customer>(); products = results.GetProducts<Product>(); } // Now return the view,with the viewdata that is required. return View(new IndexViewData { Customers = customers,Products = products }); }
.
Index.aspx <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IndexViewData>" %> <% Html.RenderPartial("CustomersUserControl",ViewData.Model.Customers); %> <br/> <h2>Products</h2> <% foreach(var product in ViewData.Model.Products) { %> Name: <%= product.Name %><br/> <% } %> ...
请注意,我没有做任何错误检查等,这是一个非常快的pseduo代码指南,让你开始.
注意#2:请注意,索引视图是强类型的(它继承ViewPage.
强类型存储过程输出
以上我回答过.请注意,您可以强力键入您的ISingleResult存储过程.
LINQ列查找
好的,我想我明白你的意思,在这里.
当您创建调用存储过程(或者ISingleResult或IMultipleResult)的方法时,您正在定义所需的参数,然后将其视为硬编码.
当您将列表拖放到linq到sql上下文gui canvas时,Visual Studio会在那里进行查找检查.然后在上下文的各种文件之一中创建类.例如. NorthwindDataContext.designer等等,所以这是一个一击.一旦创建了类,设计器就会在画布上显示.没有SYNC回到数据库.没有.纳达.小人物.如果您更改数据库模式中的任何内容(例如,添加新字段,更改存储过程参数等),数据报文不会知道.您需要删除表格并将其拖放回来.
奖金伎俩!
如果您在将表或存储过程拖放到画布上时运行sql Profiler,则可以看到Visual Studio对数据库进行查询. 原文链接:https://www.f2er.com/aspnet/250527.html