Ответ 1
Я рассмотрю это немного глубже, потому что определенные модели функции не очень хорошо известны.
Определенные функции должны быть добавлены вручную в 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-entities:
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. Определенные функции могут быть намного сложнее.