Я не знаю, что я видел с ExecuteFunction, но она не работала.Наконец-то я получил комплексное решение вместе с помощью этой публикации и статьи, показанной в других ответах.
Шаг первый - вставить функцию в файл EDMX:
<Function Name="ProcessReplacements" ReturnType="nvarchar(max)" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="Data">
<Parameter Name="VersionId" Type="uniqueidentifier" Mode="In" />
<Parameter Name="SurveyId" Type="uniqueidentifier" Mode="In" />
<Parameter Name="Input" Type="nvarchar(max)" Mode="In" />
</Function>
Шаг второй - настроить класс в том же пространстве имен, что и файл EDMX (это легко сделать, создав класс в том же каталоге, что и файл EDMX:
using System.Data.Objects.DataClasses;
namespace Same.As.Edmx
{
public static class EdmFunctions
{
[EdmFunction("SurveyDesignerModel.Store", "ProcessReplacements")]
public static string ProcessReplacements(Guid VersionId, Guid SurveyId, string Input)
{
throw new NotSupportedException("Direct calls are not supported.");
}
}
}
Шаг третий:чтобы написать запрос объекта, указывающий на функцию:
using System.Data.Objects;
protected string ProcessReplacements(Guid versionId, Guid surveyId, string input)
{
if (input == null)
return null;
List<ObjectParameter> parameters = new List<ObjectParameter>(3);
parameters.Add(new ObjectParameter("VersionId", versionId));
parameters.Add(new ObjectParameter("SurveyId", surveyId));
parameters.Add(new ObjectParameter("Input", input));
var output = db.CreateQuery<string>("SurveyDesignerModel.Store.ProcessReplacements(@VersionId, @SurveyId, @Input)", parameters.ToArray())
.Execute(MergeOption.NoTracking)
.FirstOrDefault();
return output;
}
Ключом для меня был вызов CreateQuery для контекста объекта и синтаксиса «строки запроса». Обратите внимание на полную квалификацию ссылки на функцию, определенную вEDMX, это было мое недостающее звено: -)