Я расскажу об этом немного глубже, потому что определяемые моделью функции не очень хорошо известны.
Определенные моделью функции должны быть вручную добавлены в CSDL-часть файла EDMX.Вы должны открыть файл в формате XML и добавить функцию.Например, эта функция, определенная моделью, может выдавать полное имя сотрудника:
<Function Name="FullName" ReturnType="Edm.String">
<Parameter Name="emp" Type="TestModel.Employee" />
<DefiningExpression>
Trim(emp.FirstName) + " " + Trim(emp.LastName)
</DefiningExpression>
</Function>
Теперь вы можете сохранить свой EDMX и вернуться к конструктору.Функция все еще будет присутствовать, но она не видна в браузере модели.Вы можете обновить свою модель из базы данных или удалить все свои объекты, но функция все равно будет определена.EF не удаляет пользовательские изменения в CSDL-части EDMX.
Теперь вам нужно определить функцию .NET, чтобы использовать эту функцию, определенную моделью.Вы можете сделать это где угодно.Одним из способов является использование частичного класса для контекста, но в то же время вы можете просто использовать некоторый класс cutom:
public static class EdmFunctions
{
[EdmFunction("TestModel", "FullName")]
public static string FullName(Employee e)
{
throw new NotSupportedException("This function is only for L2E query.");
}
}
И все готово.Единственной оставшейся задачей является использование функции в запросе Linq-to-entity:
using (var context = new TestEntities())
{
var query = from e in context.Employees
select new
{
e.Id,
FullName = EdmFunctions.FullName(e)
};
var data = query.ToList();
...
}
Функции, определяемые моделью, - это просто некий повторно используемый Entity SQL, который переводится в SQL, поэтому их можно использовать только в Linq-to-entity.запросы сущностей.Определенные моделью функции могут быть намного более сложными.