2012-01-10 5 views
6

私はLinSにEntityを使用しています。私は、randのようなMySql関数で構築された様々なものを使用できるようにしたいと思います。 MS SQL Serverを使用していた場合、SqlFunctionsクラスを使用できますが、これはMySqlでは機能しません。私は、データベースからの私のモデルを更新MySqlとEntity FrameworkでのSqlFunctionsまたは同等のEdmFunctionsコレクションの使用

CREATE FUNCTION Random() 
RETURNS real NOT DETERMINISTIC 
RETURN RAND(); 

(:私はRANDに建てラップ私のデータベースのユーザー定義関数を作成する方法を考え出した

Rand() on the type 'System.Data.Objects.SqlClient.SqlFunctions' cannot be translated into a LINQ to Entities store expression.

:私はエラーを取得しますI).ebmxを使用していて、そのような静的クラスを作成:

public static class MyUserFunctions { 
    [EdmFunction("MyModelNamespace.Store", "Random")] 
    public static double Random() { 
     throw new ArgumentNullException(); 
    } 
} 

そして、それは私が私のエンティティクラス上.Where句内MyUserFunctions.Randomを呼び出すことができます:

using (MyEntities entities = new MyEntities()) { 
    // Yes, I know ORDER BY RAND() is slow 
    return entities.products.OrderBy(prod => MyUserFunctions.Random()).Take(4); 
} 

そこで質問があり、私は愚かなラッパーUDFを作成せずにこれを行うには、ちょうどすべての場合には(おそらく適切EdmFunctionNamespaceプロパティを設定することで、(より直接的に利用できるMySQL関数で構築することができますSqlFunctions名前空間は"SqlServer"です)。

+0

は、あなたのプロジェクトにMySQLの.NETコネクタを追加していますか? http://dev.mysql.com/downloads/connector/net/ – nisav

答えて

0

そこにすべてのプロバイダは、この参照、それらをサポートする必要があり、そのいくつかCanonical Functionsです:Canonical Functionsが、私は何のRandom正規の機能がないと思い、Randomがリストに存在する場合、あなたは、単にCLR Methodを作成してRandomにマップすることができます任意のRandom正規の機能がない場合EdmFunction属性とEdmNamespaceName、およびモデル内のUDF<function> elementを作成する必要はありませんで...、あなたは含む概念スキーマ定義言語でfunction要素(CSDL)を作成することができますDefiningExpression要素を作成し、を定義するのではなく、このセクションの(おそらくTSQLの)文を記述します。 DataBaseで、およびそれのためのinput parameterreturn typeを定義し、それにEdmFunctionによってCRL functionをマッピングし、linqクエリから呼び出し、これを参照してください。Call Model-Defined Functions in Queries

関連する問題