私のアプリはクライアントサーバーセットアップであり、クライアントはサーバーに特定のリージョンのオブジェクトを要求します。サーバーのx座標とy座標、および半径を送信します。次に、サーバーは、指定された領域内のオブジェクトについてSQLServerデータベースにクエリを実行する必要があります。データベースでは、オブジェクトはx座標とy座標で保存されます。
最初に、WCFを介してサーバーに渡されるオブジェクトのcontains
メソッドを試しました。Region
もちろん、メソッドをT-SQLに変換できなかったため、機能しませんでした。しかし、linqクエリで単純なラムダ式が使用されているのを見たので、これを試しました。
Func<UniverseStationaryObject, RegionLocation, bool> contains =
(universeObject, location) => Math.Sqrt(
Math.Pow(universeObject.locationX - location.x, 2) +
Math.Pow(universeObject.locationY - location.y, 2)
) <= location.radius;
var objects = from o in dataContext.UniverseStationaryObjects
where contains.Invoke(o, Location)
select o;
残念ながら、これも機能しませんでした。Linqto SQLクエリでいくつかの関数が許可されていることを読みましたが、数学関数はその中に含まれていないと思いますか?このためにストアド関数が必要ですか?ストアド関数はどのようになりますか(T-SQLで記述したことはありません)?C#オブジェクトを関数に渡し、dbサーバーに渡すためにすべての値を抽出することを回避できますか?つまり、格納された関数をlinq-to-sqlクラスデザイナに追加するときに、オブジェクトを受け入れてその時点で値を抽出できるようにすることはできますか?
すべてのオブジェクトを取得してC#でフィルタリングするオプションではないことに注意してください。