2009-12-12 14 views
5

Linqは、Geographyのデータ型をサポートしていないため、素敵な「ドラッグテーブルからLinqデザインサーフェイス」開発モデルに大きなスパナがスローされます。Linqとサポートされていないデータ型(地理)

Geographyデータ型で動作するようにLinqを拡張する方法はありますか? Geographyカラムを使用する必要があるときは、常に新しいデータレイヤーとクエリセットを作成する必要がありますか?

私は数日間これに固執しており、可能であればうまくいかない。

答えて

1

Looks like自分でPOCOタイプに手動でマッピング/解析する必要があります。

3

カラムをvarbinary(max)にキャストします。これはLinqからSQL までのハンドルです。すべてのクエリでこれを避ける方法の1つは、CAST(GeographyColumn AS varbinary(max))として定義された計算列を追加することです。

データを取得したら、MemoryStreamIBinarySerializeを使用して、実際のMicrosoft.SqlServer.Types.SqlGeographyクラスに変換する短いユーティリティメソッドを作成できます。 Read/Writeの方法。

地理、ジオメトリ、hierarchyid、任意のカスタムタイプを含むCLRタイプで作業する必要がある場合は、これが唯一の実用的なソリューションです。Linqはそれらのいずれかをネイティブにサポートしていません。ボイラープレートのコードをすべて書くのはちょっと難しいですが、いくつかの拡張メソッドで簡単にすることができます。

このようにして列に対してクエリを実行することはできません。しかし、あなたはLinq Dynamic Query Libraryを使って私が途中で呼ぶものを得ることができます。インテリセンスや他のLinqのグッズはありませんが、それでもコンポジットが可能で、すべてのクエリを手作業で作成するよりも優れており、強力なタイプの結果を得ることができます。

更新:少し洗練されたソリューションhereが見つかりました。この方法でデザイナを使用できます。部分クラスにSqlGeographyラッパープロパティを追加し、SqlBytesクラスを使用してSTGeomFromWKBメソッドを使用します。ただし、それでもインラインクエリ機能は提供されません。

+0

しかし、空間クエリを実行するのに役立つものはありませんか? が好きなようにしたいのであれば、私は自分のクエリを作成しなければならないでしょう。 –

+0

Linqを同軸にする良い方法があったとしてもCLR型を列として受け入れるSQLには、そのメソッドをSQL関数呼び出しにマップする方法はまだ分かりません。あなたの最善の策はSQL Server自体にSPやUDFとしてこれらのクエリを書くことですが、アプリケーション内にSQLを書く必要がある場合は、Linq Dynamic Query Libraryを使用して必要なものを手に入れることができます。 – Aaronaught

+0

DynamicQueryに慣れていない場合に備えて、リンクの返信を更新しました。 – Aaronaught

関連する問題