2011-09-28 55 views
0

我正在編寫一個SQL腳本來更新已部署應用程序的數據庫(添加一些表並複製/更新一些數據)以適應添加到應用程序(.NET使用C#)的新功能。我已經在應用程序中編寫了一些代碼來處理這種更新(只要有新的更新可用,運行它的.sql),它可以重用於所有數據庫更新(只需提供一個新的.sql)即可。用於此功能的SQL或LINQ?

現在我遇到的問題是,我對SQL相當陌生,並且有一個非常短的時間表來準備好此更新。更新的更復雜的部分可能很容易被寫入應用程序,但爲了一致性的緣故,我想用SQL來完成。

我需要做的,我歸納爲以下算法/僞代碼:

for each category in allCategories 
    Select * from unrankedEntities 
    where Category = category 
    order by (score) 
    take top Category.cutoff 
    insert each of these into rankedEntities with rank = 0 

    Select * from unrankedEntities 
    where Category = category 
    order by (score) DESC 
    take top 16 - Category.cutoff 
    insert each of these into rankedEntities with rank = null, belowcutoff=true 

這是一般的算法,我想實現(一對夫婦更多的調整這部分後進行做完了)。在SQL中編寫這個代碼或者只是編寫LINQ來執行它(導致爲每個數據庫更新更改應用程序的數據庫更新代碼)會更高效嗎?如果SQL是最好的選擇,我在哪裏可以找到一個很好的參考/教程,涵蓋我需要做的這些主題(我已經瀏覽了幾個不同的在線,有些看起來很簡單,所以我會很感激好的一個)。

此外,如果您對改進算法有任何提示,我很樂意聽取您的建議。

編輯
我忘了提,但(score)不是存儲在unrankedEntities的值。它需要通過對另一個表中符合特定條件的行進行計數來計算每個實體的計算量,並通過一個常量和從其他表中提取的數字進行乘法運算。此外,它需要存儲到排名實體中以避免每次需要(通常)時進行所有這些計算。

編輯
有人向我指出的是,新增加的應用程序的部分已經包含了必要做所有的數據操作的代碼,所以我會用回收的簡單的解決方案去說代碼,雖然結果是不太整齊的update-via-sql類,因爲它現在有一個update-via-sql部分和update-via-code部分。

+0

LINQ to SQL或ADO.NET實體框架? –

+0

實體框架。 – yoozer8

+0

然後數據進入何處?你怎麼做你的插入?通常情況下,一些ORM軟件會執行讀取和修改......所以您使用的是什麼? –

回答

2

在調試模式下使用LINQ to SQL時,您可以看到它正在生成的SQL,如果您需要急於在此刻學習所有有關SQL的知識,您可以將其複製到腳本中。見http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx

編輯:我沒有意識到你正在使用實體框架。看到這個回答類似的問題:How do I get the raw SQL underlying a LINQ query when using Entity Framework CTP 5 "code only"?

+0

這看起來像一個非常有用的工具。我想了解更多關於SQL的知識,但是我處於一段時間的緊縮之中,學習足夠舒適地完全用SQL編寫這個腳本可能不是一個可行的選擇。 – yoozer8

+0

我不知道它是否通知你編輯,但看看我的編輯。這可能會幫助你。 – doctorless

2

LINQ對此很好,但是插入和更新每個實體的方式都是單一的,這意味着在SQL中可以用一個查詢批量更新,但是不能在LINQ中......它爲每個實體生成單獨的語句。所以SQL有一些效率提升。如果你更喜歡LINQ,可以在LINQ中使用。如果您正在談論數千個對象,則可能需要關閉更改跟蹤(通過更改合併選項在EF中關閉),因爲已更改對象的內部內存將變得相當大。