我正在开发一个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
答案 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(...)