IMultipleResults с использованием пользовательской модели и репозитория - PullRequest
0 голосов
/ 29 июля 2009

Я следую примеру Стива Сандерсона из этой книги ASP.NET MVC о создании модели вручную вместо использования инструментов построения диаграмм, чтобы сделать это для меня. Таким образом, в моем пространстве имен модели я помещаю класс с именем MySystemModel с чем-то вроде следующего

[Table(Name="tblCC_Business")]
public class Business
{
  [Column(IsPrimaryKey=true, IsDbGenerated=false)]
  public string BusinessID { get; set; }

   // this is done because Business column and Business have interfering names
  [Column(Name="Business")] public string BusinessCol { get; set; }
}

С этой частью все в порядке. Проблема, однако, заключается в возвращении нескольких наборов результатов из хранимой процедуры, но при смешивании и сопоставлении SQL с моделированием LINQ. Мы делаем это потому, что перевод LINQ to SQL слишком медленный для некоторых наших запросов (здесь нет смысла спорить об этом, это бизнес-требование). Поэтому в основном я использую реальные операторы SQL вместе с моими моделями LINQ в моем «хранилище» следующим образом:

public IEnumerable<MyType> ListData(int? arg)
{
    string query = "SELECT * FROM MyTable WHERE argument = {0}";

    return _dc.ExecuteQuery<MyType>(query, arg);
    //c.GetTable<MyType>(); <-- this is another way of getting all data out quickly
}

Теперь у меня проблема в том, как вернуть несколько наборов результатов, поскольку я не расширяю DataContext, например:

public ContractsControlRepository()
{
  _dc = new DataContext(ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString());
}

Эта ссылка описывает, как несколько наборов результатов возвращаются из хранимых процедур.

[Function(Name="dbo.VariableResultShapes")]
[ResultType(typeof(VariableResultShapesResult1))]
[ResultType(typeof(VariableResultShapesResult2))]
public IMultipleResults VariableResultShapes([Parameter(DbType="Int")] System.Nullable<int> shape)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), shape);
    return ((IMultipleResults)(result.ReturnValue));
}

Так как мне превратить это в нечто, что может быть использовано моим хранилищем? Мне просто нужно иметь возможность возвращать несколько наборов результатов из хранилища, которое содержит DataContext, а не расширяет его. Если вы скопировали и вставили предыдущий экстракт в репозиторий, как у меня, он просто укажет, что ExecuteMethodCall недоступно, но доступно только при расширении DataContext.

Ресурсы

Блог Гая Берштейна

1 Ответ

0 голосов
/ 29 июля 2009

Каждый раз, когда я задаю вопрос, который мешал мне целыми днями, я в конечном итоге нахожу ответ в течение нескольких минут. В любом случае, ответ на этот вопрос заключается в том, что вы должны расширить DataContext в своем хранилище. Если, как и я, вы беспокоитесь о необходимости указания строки подключения в каждом контроллере, то вы можете изменить конструктор в классе репозитория на что-то вроде этого:

public ContractsControlRepository()
      : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { }

Таким образом, когда вы создаете экземпляр своего репозитория, соединение уже установлено для вас, что дает вам меньше беспокойства и фактически централизует указание строки соединения. Расширение DataContext также означает, что у вас есть доступ ко всем защищенным методам, таким как ExecuteMethodCall, используемым для вызова хранимых процедур и возврата, если хотите, нескольких наборов результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...