2009-08-29 9 views
2

アクティビティは、特定の日付の場所で発生しますが、各アクティビティは、異なる日付の同じ場所または異なる場所で繰り返される場合があります。私はエンティティフレームワークモデルを作成し、指定された場所からの距離によって順序付けられた2つの日付の間に発生する関連するアクティビティをそれに設定したいと考えています。Linqまたはストアドプロシージャ - どちらを選択する必要がありますか?

私はそれゆえ、次の表があります。次のような関係で

活性(A)

発生(O)

場所(L)

を:

A 1-n O n-1 L

私はいくつかのdiエンティティへのlinqを使用してこれを行うのは難しいですが、私はストアドプロシージャでそれを実現できると確信しています。

Linqを使用してできるはずのものか、それともLinqがSqlを作成するには複雑すぎるのですか? Linqクエリを書くためのあらゆるポインタは、それができるはずのものであれば評価されるでしょう。

答えて

0
var query = from occurrence in occurrenceList 
      join activity in activityList on occurrence.ActivityID equals activity.ID 
      join location in locationList on occurrence.LocationID equals location.ID 
      let distance = CLocation.Distance (referenceLocation, location) 
      orderby distance, activity.Name 
      where start <= occurrence.Date && occurrence.Date <= end 
      select new 
      { 
       ActivityName = activity.Name, 
       LocationName = location.Name, 
       Distance = distance, 
       Date = occurrence.Date 
      };
+1

これはLINQで行うことができますが、私はHakan Wintherに同意します。ストアドプロシージャは、この種のロジックを配置するより適切な場所のようです。 – XXXXX

2

私はそれがなぜ不可能か、あるいは特に困難であるのか分かりません。それは質問ですか? :)

私が理解しているように、アクティビティテーブルはあなたのクエリにとって興味深いものではありません。オカレンスを見つけることから始めます。あなたは、このような出力にActivityデータを含めることができます。

dc.Occurrence.Include("Activity").Where(
    o => o.Date >= startDate && o.Date <= endDate 
    && o.Location.DistanceFrom(someLocation) < maxDistance) 

DistanceFromは、しかし、あなたがた場所からの距離を決定するだろう..私にはありませんどのようにデータベース設計については何も。

SQL Server 2008ジオコーディングを使用している場合は、まだサポートされていないと思います。 This article(およびthis continuation)が興味深いかもしれません。 LINQ to SQLについてですが、式の構築は助けになるかもしれません。 Linq2Sqlで

+0

私はdownvoteに憤りを感じています。もともと、それはLINQのクエリについてのポインタを与えることについて何も言わなかった... – Thorarin

+0

ありがとう、私はなぜコメントなしでそれを残して、下の投票がかなり役に立たないimho ..追加されたリンクをありがとう、私は最初を見たが、2番目の本当に私の質問に答えるようです。 linqを使用した距離の計算が遅いため、spが推奨されます。 例外として、コードで実際にコンパイルエラーが発生します。 "Delegate 'System.Func 'は1つの '引数を取らない'。それがなぜ起こっているのでしょうか? – Richbits

+0

Thoarin cool :)私はちょうどupvoteにそれを回した、私はその悪いことを残念に編集を逃した。 – olle

0

、設計者はLinq2Entitiesで自動的L2Sクラス内の関係を作成します(ただし、デザイナでそれらを表示しません)

、設計者は、外部キー関係が表示されますが、それらを自動的に作成しません - 手動で行う必要があります。 (そのステートメントはLinq2Entitiesのベータに基づいていました---それはもはや真実ではないかもしれません)。

+0

関係は自動的に作成されます。 – Thorarin

+0

いいえ、データベースにある場合はデータベースから取得します。リレーションシップのないデータベースをお持ちの場合は、それらを手動で追加するまで、linq-2-sqlデータモデルに関係はありません。 –

1

私はLinqを使いませんでしたが、おそらく私は完全に間違っていますが、Linqを使用してもストアドプロシージャを使用できませんか?ストアドプロシージャを使用する主な理由の1つは、下位レイヤのデータモデルをビジネスレイヤから隠すことです。データモデルを非表示にすることで、データアクセスを最適化できます。プロシージャはアプリケーションとレポートのインタフェースとして使用され、データモデルを変更する必要がある場合は、インタフェースを破ることなく実行できます。

これは私の意見ですが、DBAの観点からです。私が言ったように、私はLinqの子犬が何であるか分からない。 P質問が編集されました:

+0

はい、あなたは完全に間違っています - できます。場合によっては、linq-2-sqlモデルを使用していても、データ処理はdbで行うほうがはるかに効率的です。私は、linop-2-sqlを使用しないためにpeopelがこれを引数として使用すると考えています。私は同意しないが、説明に時間がかかるだろう。 –

+0

私たちはお互いに勘違いすると思います。私はストアドプロシージャとLinqを使用する場合、それは大丈夫だと言うつもりです。 DBAとして、私はDBでデータ処理をしたいです。 –

関連する問題