Я задавал несколько вопросов на эту тему раньше. Прежде чем мы сможем внедрить в работу MVC или LINQ, нам нужно решить несколько вопросов.
Несколько наборов записей в ASP.NET MVC
Единственные используемые примеры MVC возвращают только один набор результатов. При использовании хранимых процедур можно получить несколько наборов записей, и единственная причина, по которой мы склонны использовать хранимые процедуры, заключается в двух причинах (которые, я уверен, многие из вас также знают). Во-первых, если нам нужно передать параметры, и, во-вторых, если мы хотим, чтобы было возвращено несколько таблиц данных. Как это возможно в архитектуре MVC ASP.NET?
В этом уроке мы видим, как извлекаются данные. Но он использует 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 является единственным доступным методом возврата результатов, поэтому вам нужно выполнить итерацию по коллекции и добавить их в общий список.
Большое спасибо!