1

私のアプリはクライアントサーバーセットアップであり、クライアントはサーバーに特定のリージョンのオブジェクトを要求します。サーバーの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#でフィルタリングするオプションではないことに注意してください。

4

1 に答える 1

1

contains()を使用してコンパイル済みクエリを作成する必要がありますSystem.Data.Linq.CompiledQuery.Compile()。クエリを機能させるには、クエリを少し変更する必要があります。私はこのようなものがうまくいくと信じています:

Func<MyDataContext, UniverseStationaryObject, RegionLocation, bool> contains =
    CompiledQuery.Compile(
        (MyDataContext dc, UniverseStationaryObject universeObject, RegionLocation 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(dataContext, o, Location)
              select o;

参照:LINQtoSQLの再利用可能なチャンクの作成

于 2011-01-21T04:36:37.243 に答える