我应该在哪里将SQL查询存储在MVC 4中?

时间:2012-11-27 11:21:11

标签: c# sql asp.net-mvc asp.net-mvc-4

我有一个基于MVC4的项目,带有一些SQL查询。它们当前存储在项目资源(* .resx)中,但在资源编辑器中编辑查询非常困难。

是否有专门的SQL查询存储?我应该在哪里存储我的查询?

4 个答案:

答案 0 :(得分:3)

您可以将查询作为存储过程放入数据库中。这使您可以封装数据库逻辑 - “关注点分离”。

答案 1 :(得分:1)

不,SQL查询没有专门的存储空间。

资源文件听起来有点不寻常,我宁愿把它们放在代码中的常量字符串中,封装在数据层中。在使用应用参数的SQL查询的每个方法中都可以使用

但是我真的建议避免普通的旧SQL,而是使用Entity Framework或LINQ2SQL。

答案 2 :(得分:1)

我用T4解决了这个问题。现在我的项目中有Queries目录,其中有SQLGenerator.tt。这是我的模板源代码:

<#@ template  debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Windows.Forms" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #> 

<#var sqlScriptsContent = ReadSql(); #>

namespace MathApplication.SQL
{
public class Queries
{
<# foreach(var file in sqlScriptsContent) { #>
    public string <#= file.Key #> = @"<#= file.Value #>";
<# } #>
}
}

<#+ 
public Dictionary<string, string> ReadSql() {
    var filePaths = Directory.GetFiles(Host.ResolvePath("."));

    var result = new Dictionary<string, string>();

    foreach (var filename in filePaths) {
        if (filename.EndsWith(".sql")) {
            result[Path.GetFileNameWithoutExtension(filename)] = System.Text.RegularExpressions.Regex.Replace(File.ReadAllText(filename), @"\s+", " ").Replace("\"", "'");
        }
    }

    return result;
    }
#>

此代码将*.sql目录中的所有Queries个文件汇编为一个类。

答案 3 :(得分:0)

为什么不将Entity Framework用作ORM?

这是与ASP.NET MVC链接的绝佳技术。

此外,您可以将SQL移动到MSSQL中的存储过程。 在这种情况下,我建议使用Database Project将SQL存储在您的解决方案中。

无论如何在代码或资源中存储SQL都不是一个好习惯。