微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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列查找

好的,我想我明白你的意思,在这里.
当您创建调用存储过程(或者ISingleResult或IMultipleResult)的方法时,您正在定义所需的参数,然后将其视为硬编码.

当您将列表拖放到linq到sql上下文gui canvas时,Visual Studio会在那里进行查找检查.然后在上下文的各种文件之一中创建类.例如. northwindDataContext.designer等等,所以这是一个一击.一旦创建了类,设计器就会在画布上显示.没有SYNC回到数据库.没有.纳达.小人物.如果您更改数据库模式中的任何内容(例如,添加新字段,更改存储过程参数等),数据报文不会知道.您需要删除表格并将其拖放回来.

奖金伎俩!

如果您在将表或存储过程拖放到画布上时运行sql Profiler,则可以看到Visual Studio数据库进行查询.

原文地址:https://www.jb51.cc/aspnet/250527.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐