Поскольку упомянутая ссылка в помеченном ответе мертва, я изложил эту идею для будущих читателей (, конечно, я не читал упомянутую статью, но ниже будет работать, я проверял, прежде чем публиковать здесь )
Вам необходимо перегрузить автоматически сгенерированный метод вашего SP
( в классе .designer.cs ) и вырезать необязательные параметры (как вы знаете, по умолчанию, когдаВы помещаете хранимую процедуру в файл DBMLclass
, он только автоматически генерирует функцию по умолчанию)
Например.с этим SP
:
CREATE PROCEDURE sp_Test
@optionalParam INT = 0
AS
-- your logic gose here
В .designer.cs
вы получите что-то вроде ниже по умолчанию
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.sp_Test")]
public ISingleResult<sp_TestResult> sp_Test([global::System.Data.Linq.Mapping.ParameterAttribute(Name="optionalParam", DbType="Int")] System.Nullable<int> optionalParam)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), optionalParam);
return ((ISingleResult<sp_TestResult>)(result.ReturnValue));
}
Так что вам нужно overload
это, вот код:
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.sp_Test")]
public ISingleResult<sp_sp_TestResult> sp_Test()
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
return ((ISingleResult<sp_sp_TestResult>)(result.ReturnValue));
}
Помните
-
DBML designer file
будет сгенерирован заново каждый раз, когда вы добавляете / удаляете в него любой SP или таблицу, поэтому убедитесь, чтосохранить ваши методы, прежде чем вы сохраните их, или, в качестве альтернативы, переместите все перегруженные методы в новый частичный класс. - Если у вас есть SP с множеством необязательных параметров, вам придется генерировать перегруженные методы для всех возможных комбинаций,и это может быстро раздражать.Также в этом случае вам придется вызывать ИП с именованными параметрами