asp.net-mvc – ASP.NET MVC和LINQ一般问题
|
之前我就这个话题问过几个问题.在我们能够在工作中实现MVC或LINQ之前,我们需要解决一些问题. 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是唯一的返回结果的暴露方法,因此您必须遍历该集合并将其添加到通用列表中. 非常感谢! 解决方法ASP.NET MVC中的多个记录集是的 – 最确定的 首先,您需要手动创建一个调用存储过程的方法,返回一个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列查找 好的,我想我明白你的意思,在这里. 当您将列表拖放到linq到sql上下文gui canvas时,Visual Studio会在那里进行查找检查.然后在上下文的各种文件之一中创建类.例如. NorthwindDataContext.designer等等,所以这是一个一击.一旦创建了类,设计器就会在画布上显示.没有SYNC回到数据库.没有.纳达.小人物.如果您更改数据库模式中的任何内容(例如,添加新字段,更改存储过程参数等),数据报文不会知道.您需要删除表格并将其拖放回来. 奖金伎俩! 如果您在将表或存储过程拖放到画布上时运行SQL Profiler,则可以看到Visual Studio对数据库进行查询. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – ASP.NET MVC – 在ActionFilter中访问控制器
- asp.net-mvc – ASP.Net MVC如何确定用户是否可以访问一个U
- asp.net核心,角度2,PrimeNG
- asp.net-mvc – 在html.actionlink上单击转到上一页
- asp.net-web-api – 在Windows服务中使用OWIN托管WebAPI
- asp.net-mvc-2 – EditorFor – 传入字典的模型项目的类型为
- asp.net-web-api – asp.net webapi 2属性路由不工作
- asp.net – IIS Express安装目录在哪里?
- asp.net-mvc – 发布重定向到ASP.NET MVC和验证与Restful U
- asp.net – 如何在回发后阻止关闭模态弹出窗口(ModalPopupE
- asp.net – 如何禁用Web.Config中的目录浏览
- asp.net – 仅允许匿名用户通过web.config授权
- asp.net-mvc – 使用JSON,JQuery向ASP.NET MVC C
- asp.net-mvc – 在MVC Razor视图中使用@RenderBo
- asp.net-mvc – asp.net mvc强类型助手 – 你的渲
- asp.net-mvc-4 – 登录后WebSecurity.CurrentUse
- ASP.NET和System.Diagnostics跟踪 – 我错过了什
- ASP.Net下载大文件的实现方法
- .net – 从Orchard内的主题渲染图像
- asp.net-mvc – 使用ASP.NET MVC响应HTTP HEAD请
