通过c#代码从linq生成sql脚本

时间:2015-04-14 10:12:24

标签: c# sql asp.net-mvc linq linq-to-sql

我正在开发一个MVC项目,我正在执行各种CRUD操作。我正在处理xml数据,现在我想生成执行的每个CRUD操作的sql脚本。我也尝试了DataContext.GetCommand()方法和尝试将我的linq转换为ToString(),但我无法获取sql脚本或查询。请建议如何实现此目的。

以下是各种CRUD操作的示例代码:

1)选择操作

{
        var languagesList = (from ccbtlanguage in Context.tblCCBT_Language
                             join stepPageXML in Context.tblCCBT_Step_Page_Text_Xml
                                 on ccbtlanguage.Lan_Id equals stepPageXML.Lan_Id
                             where
                                 (stepPageXML.Pro_Id == productId)
                             select new StepPageData
                                 {
                                     LanguageId = ccbtlanguage.Lan_Id,
                                     LanguageName = ccbtlanguage.Lan_Language
                                 }).Distinct().ToList();
        return languagesList;
    }

2)更新操作

   public void UpdateXMLKeyValue(int xmlId, string xmlLDataString)
    {
        if (xmlLDataString == null) throw new ArgumentNullException("XMLDataString");
        var xmlDataString = Context.tblCCBT_Step_Page_Text_Xml.First(p => p.Xml_Id == xmlId);
        xmlDataString.Xml_XmlData = xmlLDataString;
        Context.SaveChanges();
    }

请建议如何从中生成sql查询或sql脚本或建议通过c#代码生成crud操作脚本的其他方法。我的意思是从sql query生成脚本.Thanx

4 个答案:

答案 0 :(得分:0)

您可以查看Linq-to-SQL Debug Visualizer,或者只是将鼠标悬停在Linq-to-SQL查询上(工具提示应显示生成的SQL)或访问:

context.GetCommand(query).CommandText

答案 1 :(得分:0)

如果您使用的是Entity Framework,则可以启用Entity Framework日志记录。

例如,在Context的构造函数中,您可以添加

Public SomeContextConstructor()
{
    AddDebugLogging() // Call the debug method for the log
}

// Have this method in your context class
[Conditional("DEBUG")]
    private void AddDebugLogging()
    {
        this.Database.Log = s => Debug.Write(string.Format("EF Log: {0}", s));
    }

因此,一旦您在Visual Studio中运行了代码,这将出现在控制台中。你可以继续运行这个sql脚本。如果你想看看Entity Framework在后台做什么,那就太好了。享受。

答案 2 :(得分:0)

我还会分析SQL Server来获取查询。由于LINQ生成的查询通常不会以易于人类可读的方式生成,因此我会将其清理以使其更易于维护并将其转换为存储过程(特别是如果您希望能够在其他服务器上使用它们)。 / p>

答案 3 :(得分:0)

首先,除非所有服务器上的数据完全相同,否则尝试从linq语句捕获sql输出并在另一台服务器上重新发出sql命令是危险的,因为sql输出取决于第一台服务器上的实际数据。例如,如果您有两台服务器的记录具有相同的Xml_Id,但其标识列的值不同,则最终可能会更新错误的记录。

最好直接尝试确定sql。

其次,您的更新例程有一个.First(..)命令但不发出命令,因此我怀疑您只希望每个Xml_Id都有记录(即.First(..)实际上应该是{{1}如果是这样,那么你的sql可能就像

一样简单
.Single(...)