Ответ 1
Это было бы тривиально со скалярной функцией (UDF), а не с SP. Однако он должен работать достаточно легко - хотя, если SP сложный (т.е. FMT_ONLY не может проверить его на 100%), вам может понадобиться "помочь" ему...
Вот некоторый dbml, который я создал из упрощенного SP, который возвращает целое число; вы можете редактировать dbml через "open with... xml editor" ):
<Function Name="dbo.foo" Method="foo">
<Parameter Name="inc" Type="System.Int32" DbType="Int" />
<Parameter Name="dataset" Type="System.String" DbType="VarChar(20)" />
<Return Type="System.Int32" />
</Function>
(обратите внимание, что вам, очевидно, нужно настроить имена и типы данных).
И вот сгенерированный С#:
[Function(Name="dbo.foo")]
public int foo([Parameter(DbType="Int")] System.Nullable<int> inc, [Parameter(DbType="VarChar(20)")] string dataset)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inc, dataset);
return ((int)(result.ReturnValue));
}
Если ваш текущий SP использует SELECT (вместо RETURN), тогда DBML должен будет отразить это. Вы можете исправить это, спрятав детали реализации и предоставив публичную обертку в частичном классе; например:
<Function Name="dbo.foo" Method="FooPrivate" AccessModifier="Private">
<Parameter Name="inc" Type="System.Int32" DbType="Int" />
<Parameter Name="dataset" Type="System.String" DbType="VarChar(20)" />
<ElementType Name="fooResult" AccessModifier="Internal">
<Column Name="value" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
</ElementType>
</Function>
В приведенном выше описании описывается SP, который возвращает одну таблицу с одним столбцом; но я сделал SP "private" для контекста данных, а результат - "внутренним" для сборки (скрывая ее):
[Function(Name="dbo.foo")]
private ISingleResult<fooResult> FooPrivate(
[Parameter(DbType="Int")] System.Nullable<int> inc,
[Parameter(DbType="VarChar(20)")] string dataset)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inc, dataset);
return ((ISingleResult<fooResult>)(result.ReturnValue));
}
Теперь в моем собственном файле класса я могу добавить новый неполный класс (новый .cs файл) в правильное пространство имен, что более удобно предоставляет метод:
namespace MyNamespace {
partial class MyDataContext
{
public int Foo(int? inc, string dataSet)
{
return FooPrivate(inc, dataSet).Single().value;
}
}
}
(имена пространств имен и контекстов должны быть такими же, как и фактический контекст данных). Это добавляет общедоступный метод, который скрывает детализацию от вызывающего.
Не редактировать файл designer.cs напрямую; ваши изменения будут потеряны. Редактируйте только dbml или частичные классы.