2011-01-21 7 views
1

私のアプリは、クライアントがサーバーに特定の地域のオブジェクトを要求するクライアント/サーバーセットアップです。サーバーxとyの座標と半径を送信します。サーバーは、指定された領域内のオブジェクトのSQL Serverデータベースを照会する必要があります。データベースでは、オブジェクトはx座標とy座標で格納されます。Linq To SQLの簡単な手順

まず、メソッドを、WCF経由でサーバーに渡された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; 

残念ながら、これは動作しませんでしたどちらか - 私は一部関数がSQLクエリにLINQのでは許可されていることを読んだことがありますしかし、数学関数はそれらの間にないと思いますか?これにはストアドファンクションが必要ですか?ストアドファンクションはどのように見えますか(私はT-SQLでこれを書いたことはありません)?関数にC#オブジェクトを渡して、dbサーバーに渡すすべての値を抽出しないようにすることはできますか?つまり、linq-to-sqlクラスのデザイナにストアド関数を追加すると、オブジェクトを受け入れ、その時点で値を抽出できるのですか?

すべてのオブジェクトを取得してC#でフィルタリングするオプションはありません。

答えて

1

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; 

も参照してください:Creating reusable chunks of LINQ to SQL

+0

oohの、クールな:)悲しいことに、私は先に行って、すでに保存された機能を作成する方法を学びました:(私はこれを試してみるつもりですあまりにも –