我之前在这个主题上问过一些问题。在我们能够在工作中实现MVC或LINQ之前,我们需要解决一些问题。
ASP.NET MVC中的多个记录集
目前使用MVC的所有示例仅返回单个结果集。当使用存储过程时,可以检索到多个记录集,并且我们通常使用存储过程的两个原因是(我相信你们许多人也知道)。首先,以防我们需要传递参数,其次,如果我们想要返回多个数据表。在ASP.NET的MVC架构中如何实现呢?
在此教程中,我们看到了如何检索数据。但它使用了ViewData.Model
,这表示一个单一的结果集,它没有解释如何获得多个结果集或如何获取它们。
强类型存储过程输出
此外,在ASP.NET网站上使用LINQ进行强类型输出分辨率的示例是通过使用*.dbml格式实现的,该格式是对表模式的镜像,允许使用LINQ针对字段进行查找。很好。但是,如果您的输出来自不直接映射到视图或表的存储过程,该怎么办?我们如何解决这些存储过程的列名?
在前一节中,我描述了此教程,但它也仅显示如何为表创建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, office, activeUser
和dept
分配上,但我不知道原因。尽管我还没有正确映射它们,以部门(Department)为例,我已经将表架构拖放到 dbml 文件中,因此它肯定存在且格式正确。
更新
这是我的实际代码。 它不是最终版,我一直在尝试改进它。似乎返回类型不正确,但我不确定原因。它似乎认为仅返回单个结果,而存储过程实际上返回四个数据集。其中一个数据集始终只有一个结果,其他数据集总是返回多行:
无法将类型为'SingleResult1 [IntranetMVC.Office]'的对象强制转换为类型'System.Collections.Generic.IList
1'
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
FIX
由于我没有正确检查返回类型,所以我并没有意识到这一点。我认为从IMultipleResults获取结果的results.GetResult(Of MyType)会返回一个集合,但实际上它只返回单个结果,并将指针移动到集合中的下一项。不幸的是,GetResult是唯一暴露的方法来返回结果,因此您必须迭代集合并将其添加到泛型列表中。
非常感谢!