モデル定義関数はあまり知られていないので、少し深く取り上げます。
モデル定義関数は、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関数を定義する必要があります。あなたはどこでもそれをすることができます。1つの方法は、部分的なクラスをコンテキストに使用することですが、同時に、いくつかのカスタムクラスを使用することもできます。
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();
...
}
モデル定義関数は、SQLに変換される再利用可能なエンティティSQLであるため、Linq-to-Entitiesクエリでのみ使用できます。モデル定義関数は、はるかに複雑になる可能性があります。