Я следую примеру Стива Сандерсона из этой книги 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
.
Ресурсы
Блог Гая Берштейна