Я задал несколько вопросов по этой теме раньше. Прежде чем мы сможем реализовать 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
, но я понятия не имею, почему. Теперь я пока неправильно их не наметил, но возьму, например, Департамент. Я перетащил схему таблиц в файл dbml, поэтому она определенно существует и находится в правильном формате.
UPDATE
Вот мой реальный код. Это не окончательно, я играл с ним. Кажется, что типы возврата неверны, но я не уверен, почему. Кажется, что только один результат возвращается, когда хранимая процедура фактически возвращает четыре набора данных. Один из этих наборов имеет только один результат, остальные всегда имеют несколько возвращенных строк:
Невозможно передать объект типа "SingleResult 1[IntranetMVC.Office]' to type '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
Хорошо, я не понимал, потому что, честно говоря, я не правильно проверял возвращаемые типы. Я предположил, что results.GetResult(Of MyType) (из IMultipleResults) вернет коллекцию. Наоборот, он возвращает только одиночные результаты и перемещает указатель на следующий элемент в коллекции. К сожалению, GetResult - единственный открытый метод для возврата результатов, поэтому вам нужно перебирать коллекцию и добавлять их в общий список.
Большое спасибо!