2009-08-29 21 views
2

活動發生在特定日期的某個位置,但每個活動可能會在不同日期的相同或不同位置重複。我已經創建了一個實體框架模型,並且希望使用兩個日期之間發生的相關活動來填充它,這些活動由距指定位置的距離排序。Linq或存儲過程 - 我應該選擇哪一個?

我所以具有以下表:

活性(A)

發生(O)

地點(L)

隨着關係如下:

甲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 2009-08-29 14:41:29

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的,但構建表達式可能會有所幫助。

+0

我反感downvote:P此問題已編輯。最初,它沒有提到任何關於LINQ查詢的指針... – Thorarin 2009-08-29 13:50:07

+0

謝謝,我不明白爲什麼投下來,留下它沒有評論是非常無益的IMHO ..感謝加入的鏈接,我看到了第一個,但第二個似乎回答我的問題。由於使用linq計算的距離很慢,因此建議使用sp。另外,您的代碼實際上會產生編譯錯誤: 「Delegate'System.Func '不帶1'參數」。任何想法爲什麼這可能是? – Richbits 2009-08-29 14:39:47

+0

Thoarin cool :)我只是把它變成upvote,我錯過了編輯抱歉,關於我的壞。 – olle 2009-08-29 14:43:30

0

在LINQ2SQL,設計者將自動創建在L2S類的關係(但不會在設計器中顯示它們)

在Linq2Entities,設計師將顯示外鍵關係,但不會自動創建它們 - 必須手動完成。 (該聲明基於Linq2實體的測試版 - 可能不再是真實的)。

+0

關係是自動創建的。 – Thorarin 2009-08-29 13:48:48

+0

不,如果他們在那裏,它會從數據庫中獲取它們。如果你有一個沒有關係的數據庫,那麼你沒有關係到你的linq-2-sql數據模型,直到你手動添加它們。 – 2010-03-10 13:38:50

1

我沒有使用LINQ的,也許我是完全錯誤的,但不能使用,即使您使用LINQ的存儲過程?使用存儲過程的主要原因之一是從業務層隱藏底層數據模型。通過隱藏數據模型,您可以優化數據訪問。這些過程用作應用程序和報告的接口,如果您需要修改數據模型,則可以在不中斷接口的情況下完成此操作。

這是我對DBA的看法。正如我所說的,我不知道Linq的puprose是什麼。

+0

是的,你完全錯了 - 你可以。在某些情況下,數據處理應該在db上完成,因爲即使使用linq-2-sql模型,它的效率也會更高。我想像一些peopel會將它用作不使用linq-2-sql的參數。我不同意,但需要一段時間來解釋。 – 2010-03-10 13:36:47

+0

我認爲我們彼此之間有誤解。我想說,如果你使用Linq和存儲過程,那沒問題。作爲DBA,我希望數據處理在數據庫中完成。 – 2010-03-12 13:59:40