Вы не можете использовать произвольную функцию в linq-to-entity. Это объяснялось много раз. Например, здесь . Если вы хотите использовать пользовательскую функцию в запросе Linq-to-entity, вы должны определить ее как пользовательскую функцию SQL (UDF) в вашей базе данных и отобразить ее.
Первая функция создания
CREATE FUNCTION dbo.udf_GetAccountTypeDescription (@Param VARCHAR(50))
RETRUNS VARCHAR(100)
AS
BEGIN
RETURN @Param + ' ' + 'Item type'
END
Теперь вы должны обновить модель и импортировать функцию (она будет указана среди хранимых процедур). После того как ваша функция импортирована в SSDL (описание хранилища в EDMX), вы можете отобразить функцию:
public static class EdmFunctions
{
// First parameter is namespace of SSDL (open EDMX as XML if you are not sure about namespace)
[EdmFunction("TestModel.Store", "udf_GetAccountTypeDescription")]
public static string GetAccountTypeDescription(string parameter)
{
throw new NotSupportedException("This function is only for L2E query.");
}
}
Эта функция является только заполнителем, используемым в дереве выражений. Он будет заменен сопоставленной функцией SQL, когда провайдер магазина преобразует дерево выражений в запрос SQL. Теперь вы можете использовать это в своем запросе Linq-to-entity:
AccountTypeDescription = EdmFunctions.GetAccountTypeDescription("...")