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 Web应用程序中视图逻辑和域逻辑之间的混淆
- asp.net – 生成PDF,IE和HTTPS错误
- asp.net-mvc – 如何在ASP.NET MVC视图中访问路由参数?
- asp.net-mvc – 使用NHibernate.AspNet.Identity
- asp.net – 在IE11中无法正确显示站点
- 从ASP.NET MVC应用程序中的Amazon SES发送电子邮件
- asp.net-web-api – 如何设置katana-project以允许json格式
- 实体框架asp.net应用程序中的UOW和存储库
- asp.net-mvc-4 – 始终显示在Kendo网格中选择的第一行
- ASP.net会员强制用户离线(作为管理员)
- asp.net – Http Handler正在iis express中工作,
- asp.net-mvc-3 – ASP.NET MVC3 Razor:没有@if或
- asp.net – 根据角色重定向到其他页面
- asp.net-mvc – 阻止对返回部分视图的控制器的直
- HP Fortify:ASP.NET不良实践:会话中存储的非可
- asp.net-mvc – 是否可以在一个命令中搭建多个控
- 如何说服我的管理员从ASP.NET 2.0升级到3.5?
- asp.net – MVC 3/4 HttpModule或ActionFilter
- 更改用户名ASP.net MVC 3会员资格
- asp-classic – 如何在Classic ASP中延迟响应