2011-01-01 4 views
1

関数に式を書き込み、それをEFクエリに渡します。それは動作しません。しかし、Math.Pow(x、x)のような関数が機能します。どうして?自分の数式をクエリに直接組み込む必要がありますか?数式をエンティティフレームワークに渡す

var i = from u in Locations 
    where (SquareRoot(u.SomeField) < radius) 
    select u; 

    public double SquareRoot(double val) 
    { 
    return Math.Pow(val, 0.5); 
    } 

しかし、これは動作します:

var i = from u in Locations 
    where (Math.Pow(u.SomeField, 0.5) < radius) 
    select u; 

私が使用したい実際の式は、単純な四角よりもはるかに大きくなります。地球上の点間の距離などの公式。これが私がクエリから数式を抜き出して関数として使用するのが好きな理由です。

実際の式は次のようになります。

public double DistanceBetweenPoints(double centerLat, double centerLon, double pointLat, double pointLon) 
{ 
    const double sphericalValue = 69.1; 
    return Math.Sqrt((Math.Pow(sphericalValue*(pointLat-centerLat), 2)) + (Math.Pow(sphericalValue*(pointLon-centerLon)*Math.Cos(centerLat/57.3), 2))); 
} 

Math.Sqrt()とMath.CosはEFでサポートされていません。

+0

ここでお手伝いできますか? 'Math.Pow(u.Latitude、0.5)'は実際に意味がありますか? – jason

+0

私は式を簡略化しましたが、私が遭遇した問題は 'Math.Sqrt'はサポートされていませんでした。これはSquareRootと同じです。 –

+0

私は、緯度の平方根が、特に半径と比較して意味のあるものであったことにちょっと驚いていましたが、実際に何かを使用していないという例を作り上げているようです。 – jason

答えて

2

フレームワークはメソッドをSQLに変換する方法を理解できないためです。あなたはそれを行うためにはフレームワークをあまりにも多く求めています。クエリプロバイダが式ツリー(Expression.Call)内のいずれかのメソッドへの呼び出しに遭遇すると、呼び出されるメソッドはそれに応じて解析して呼び出す方法を知らないことに注意してください。

ただし、提供されるクエリは、そのように設計されているため、Math.PowPOWERに変換する方法を知っています。

本当に簡単です。

+0

クエリ内で使用する数式を統合しますか?それは唯一の方法ですか? –

+0

@Shawn Mclean:サーバー上でユーザー定義の関数を試して、EF経由でモデルに取り込むことができます。 (私はこれをやったことがない、私はサーバー上のビジネスロジックを嫌うので、それはオプションです。) – jason

関連する問題