모델 정의 함수가 잘 알려지지 않았기 때문에 나는 조금 깊이 생각할 것입니다.
EDMX 파일의 CSDL 부분에 모델 정의 함수를 수동으로 추가해야합니다. 파일을 XML로 열고 함수를 추가해야합니다.
<Function Name="FullName" ReturnType="Edm.String">
<Parameter Name="emp" Type="TestModel.Employee" />
<DefiningExpression>
Trim(emp.FirstName) + " " + Trim(emp.LastName)
</DefiningExpression>
</Function>
지금 당신은 당신의 EDMX을 저장하고 디자이너로 반환 할 수 있습니다 : 예를 들어이 모델 정의 함수는 직원의 전체 이름을 생성 할 수 있습니다. 이 함수는 여전히 존재하지만 모델 브라우저에는 표시되지 않습니다. 데이터베이스에서 모델을 업데이트하거나 모든 엔티티를 삭제할 수 있지만 기능은 계속 정의됩니다. EF는 EDMX의 CSDL 부분에서 사용자 지정 수정을 제거하지 않습니다.
이제이 모델 정의 함수를 사용할 수 있도록 .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에 - 투 - 엔티티 쿼리의 기능을 사용하고 있습니다 :
using (var context = new TestEntities())
{
var query = from e in context.Employees
select new
{
e.Id,
FullName = EdmFunctions.FullName(e)
};
var data = query.ToList();
...
}
모델 정의 함수는 단지 그들이 단지 Linq에 - 투 - 엔티티 쿼리에서 사용할 수 있도록 SQL로 번역되어 일부 재사용 법인 SQL입니다 . 모델 정의 함수는 훨씬 더 복잡 할 수 있습니다.
좋은 답변 - 모델을 업데이트 할 때 모델 정의 함수가 파손되지 않음 – BrokenGlass
후속 조치로 [모델 : 개념 모델 (사용자 정의 함수)에서 사용자 지정 함수를 정의하는 방법]에 대한 MSDN 문서가 있습니다. Framework)] (http://msdn.microsoft.com/en-us/library/dd456812.aspx) –
다른 질문에 대한 Joel Mueller의 대답은 언급 한 내용과 유사합니다. 매우 철저하며이를 만드는 방법도 보여줍니다. [LINQ to Entities] 메서드가 'Double Parse (System.String)'메서드를 인식하지 못하고이 메서드를 저장소 식으로 변환 할 수 없습니다. [1] [ 1] : http://stackoverflow.com/a/5971677/35133 –