Ответ 1
Несколько наборов записей в ASP.NET MVC
Yep - наиболее определенно.
Сначала вам нужно вручную создать метод, который вызывает хранимый процесс, возвращая результат IMultipleResults
.
В этих сообщениях в блоге есть все необходимое вам. Это просто сделать и очень легко и работает.
Что вам нужно сделать, это два шага.
- Создайте метод, который вызывает хранимую процедуру и возвращает несколько записей (см. выше в блоге).
- Создайте простой объект класса, который используется в представлении, и контроллер устанавливает свойства.
например.
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 для запуска u.
Примечание # 2: Обратите внимание, что представление индекса строго типизировано (оно наследует ViewPage.
Сильно напечатанный файл хранимой процедуры
Я ответил на это выше. Обратите внимание: u может сильно набирать ваши хранимые процедуры ISingleResult.
Поиск столбцов LINQ
Хорошо, я понимаю, что понимаю, что вы имеете в виду.
Когда вы создаете свой метод, который вызывает хранимую процедуру (либо ISingleResult
, либо IMultipleResult
), вы определяете требуемые параметры, то и тут... думайте об этом как о жестко закодированном.
Когда вы перетаскиваете таблицы с перетаскиванием в linq в sql-контекст gui canvas, Visual Studio делает проверку проверки там и потом. Затем он создает классы в одном из различных файлов для контекста. например. NorthwindDataContext.designer и т.д. Итак, это однократная работа. После создания класса дизайнер затем отображает это на холсте. Существует NO SYNC обратно в базу данных. Никто. Нада. Шиш. Если вы измените что-либо в своей схеме базы данных (например, добавьте новое поле, измените аргумент хранимой процедуры и т.д.), Datacontext НЕ узнает об этом. Вам нужно удалить таблицу и перетащить ее обратно.
Бонусный трюк!
Если у вас есть SQL Profiler, работающий во время перетаскивания таблицы или хранимой процедуры на холст, вы можете увидеть, как Visual Studio "запрашивает" базу данных для информации.:)
Так что да. Это огонь-н-забыть. Однократная работа. Требуемая ручная синхронизация.
НТН.
Update
Я заметил, что вы добавили еще два q, поэтому я добавлю ответы ниже.
Форматы DBML
Это личное решение. 15 DB! shees! это справедливое число. В любом случае, это сводится к тому, насколько легко поддерживается ваш холст Context. Во-вторых, каждый контекст создает его СОБСТВЕННОЕ соединение с базой данных. Поэтому, если ваш метод решает назвать 4 контекста, у вас есть 4 соединения (и круглые поездки) в db, чувак:)
Вид для каждого выхода
Лично у меня есть все мои таблицы на холсте контекста. Я никогда не использую эти классы таблиц в своем коде. Они являются частными и используются только в моем пространстве имен/проекте/dll хранилища. я THEN используйте классы POCO, чтобы переместить все мои вещи. Это сохраняет мой код, чище и не зависит от репозитория.
Обновление # 2
Это должна быть последняя проблема или я буду есть свой собственный рука
Если вы перетащили сохраненный proc на холст контекста linq, удалите его. Не нужно ссылаться на метод UserDetails(int userId)
.
Теперь добавьте следующий код (вам нужно будет преобразовать его в VB.NET) в частичный класс контекста данных (я предполагаю, что вы знаете, что это означает/означает, btw): -
[Function("UserDetails")] // <-- This is the name of your stored procedure.
[ResultType(TypeOf(UserDetail))]
[ResultType(TypeOf(Office))]
[ResultType(TypeOf(ActiveUser))]
[ResultType(TypeOf(Department))]
public IMultipleResults UserDetails(
[Parameter(Name = "UserId", DbType = "Int")] int userId)
// /\____ /\_____ ____/\
// This is where u _define_ the stored proc arguments.
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)MethodInfo.GetCurrentMethod())), userId);
// This is where all the stored proc arguments are set ____/\
// This can be multiple args. eg. userId, name, ...
return (IMultipleResults)result.ReturnValue;
}
то используйте его, как и в предыдущем коде VB.NET.
Проблема (я предполагаю) заключалась в том, что вы не использовали метод для обработки IMultipleResults
. Вы по-прежнему используете старую хранимую кодовую подпись proc, которая была сделана (по умолчанию) только для одного результата набора записей (т.е. ISingleResult
).
Это значение по умолчанию, если u перетащить-n-drop из сохраненного из Server Explorer в Linq Context Canvas.