我正在编写一个SQL脚本来更新已部署应用程序的数据库(添加一些表并复制/更新某些数据)以适应添加到应用程序的新功能(使用C#的.NET)。我在应用程序中编写了一些代码来处理这些更新(无论何时有新的更新,运行它的.sql),它都可以重用所有数据库更新(只需提供一个新的.sql)。
我现在遇到的问题是我对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中的值。需要通过计算另一个表中与特定条件匹配的行来计算每个实体的计算结果,并通过常量和从其他表中提取的数字进行多次计算。此外,它需要存储在rankingEntities中,以避免每次需要时(通常)进行所有这些计算。
修改:
我已经向我指出,应用程序的新增部分已经包含了执行所有数据操作所需的代码,因此我将使用回收该代码的简单解决方案,尽管结果是更不整齐的更新-via-sql类,因为它现在有一个update-via-sql部分和update-via-code部分。
答案 0 :(得分:2)
在调试模式下使用LINQ to SQL时,你可以看到它正在生成的SQL,你可以将其复制到脚本中,如果你需要快点而不是在此刻学习所有SQL。见http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx
编辑:我没有意识到您使用的是Entity Framework。请参阅针对类似问题的回复:How do I get the raw SQL underlying a LINQ query when using Entity Framework CTP 5 "code only"?。
答案 1 :(得分:2)
LINQ对此非常好,但是以单一方式插入和更新每个实体,这意味着在SQL中你可以用一个查询批量更新,但是你不能在LINQ中...它为每个实体生成单独的语句。所以SQL有一些效率提升。如果您对LINQ更熟悉,请在LINQ中进行。如果您正在谈论数千个对象,您可能希望关闭更改跟踪(通过更改合并选项在EF中关闭),因为更改对象的内部内存将变得相当大。