我们有一个遗留应用程序,我们在数据库中调用用户定义函数。这个Udf返回一个非常大的xml字符串(大约1971540个字符)。令人惊讶的是,linq to sql的 ExecuteMethodCall 运行得非常快,而普通的Ado.Net DbDataReader.GetString()却很慢!!!
我们已经标记了调用,L2S可以在4秒内获取它,而普通的Ado.net DbDataReader.GetString()在大约37秒内获取它。
查看L2S代码,它似乎使用相同的DbDataReader.GetString()方法,尽管是通过动态生成的IL代码。 http://referencesource.microsoft.com/#System.Data.Linq/SqlClient/Reader/ObjectReaderCompiler.cs,b2f6633a6c502138
我想了解是什么让L2S能够在如此短的时间内读取如此庞大的数据?
请注意,即使在第一次调用时它也运行得足够快,因此它可能不会缓存魔术。
修改
using (DbConnection con = _dataContext.Database.Connection)
{
DbCommand cmd = con.CreateCommand();
cmd.CommandText = sql;
cmd.Transaction = _dataContext.Database.CurrentTransaction.UnderlyingTransaction;
parameters.Cast<System.Data.SqlClient.SqlParameter>().ToList().ForEach(x => cmd.Parameters.Add(x));
cmd.CommandTimeout = 500;
if (con.State != System.Data.ConnectionState.Open)
con.Open();
using (var reader = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess | System.Data.CommandBehavior.SingleResult | System.Data.CommandBehavior.SingleRow))
{
if (reader.Read())
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
var data = reader.GetString(0);
sw.Stop();
var et = sw.Elapsed.TotalSeconds;
}
}
}
问候。
答案 0 :(得分:0)
最后经过大量的思考和调整......结果证明是 MARS 配置的问题!!
MARS在我们最新的重构代码(我认为EF的默认行为)中打开了,因为它在Linq中没有出现在sql连接字符串中。
删除&#34; MultipleActiveRecordSets = True;&#34;从连接字符串它工作正常。不知道为什么删除MARS有效。
希望它能帮助将来遇到类似问题的人。