【发布时间】:2015-04-29 15:39:24
【问题描述】:
我的 datacontext 类中有三个方法,它们都调用具有不同行为的略有不同的存储过程;追加、更新、覆盖。然而,这三种方法本质上具有相同的代码。唯一的区别是装饰方法的System.Data.Linq.Mapping.FunctionAttribute 的“名称”属性。
[Function(Name = "import.usp_MyData_ProcessImportAppend", IsComposable = false)]
或
[Function(Name = "import.usp_MyData_ProcessImportUpdate", IsComposable = false)]
或
[Function(Name = "import.usp_MyData_ProcessImportOverwrite", IsComposable = false)]
本质上它们看起来都与此相似
/// <summary>
/// Processes the import.
/// </summary>
/// <param name="loadId">The load id.</param>
/// <exception cref="System.ArgumentNullException">loadId</exception>
[Function(Name = "import.usp_MyData_ProcessImportAppend", IsComposable = false)]
public Int32 ProcessGradingImport(string loadId)
{
// Validate parameter
if (String.IsNullOrEmpty(loadId)) throw new ArgumentNullException("loadId");
// Initialise the result and the procedure parametes
Int32 result = 0;
object[] parameters = { loadId };
// Call the procedure, and return the result
IExecuteResult executionResult = ExecuteMethodCall(this, (MethodInfo)(MethodBase.GetCurrentMethod()), parameters);
if (executionResult != null) result = (int)executionResult.ReturnValue;
return result;
}
有什么方法可以编写一个泛型方法来传递要映射到的函数名吗?谢谢。
更新 因此,基于 Ron 和 Alex 的出色解决方案,我现在有了
/// <summary>
/// Process imports.
/// </summary>
/// <param name="methodInfo">The method information.</param>
/// <param name="loadId">The load identifier.</param>
/// <returns></returns>
/// <exception cref="System.ArgumentNullException">loadId</exception>
private Int32 ProcessImport(MethodInfo methodInfo, string loadId)
{
// Validate parameter
if (String.IsNullOrEmpty(loadId)) throw new ArgumentNullException("loadId");
// Initialise the result and the procedure parametes
Int32 result = 0;
object[] parameters = { loadId };
// Call the procedure, and return the result
IExecuteResult executionResult = ExecuteMethodCall(this, methodInfo, parameters);
if (executionResult != null) result = (int)executionResult.ReturnValue;
return result;
}
在装饰函数中调用...
[Function(Name = "common.usp_MyData_ProcessImportAppend", IsComposable = false)]
public Int32 ProcessImportAddNewUpdateCurrentOnly(string loadId)
{
return ProcessImport((MethodInfo)(MethodBase.GetCurrentMethod()), loadId);
}
【问题讨论】:
标签: c# linq entity-framework datacontext function-attributes