Linq to Sql Udf的调用速度比普通的Ado.net快

时间:2015-05-19 13:59:47

标签: c# sql-server entity-framework linq-to-sql ado.net

我们有一个遗留应用程序,我们在数据库中调用用户定义函数。这个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;
        }
    }
}

问候。

1 个答案:

答案 0 :(得分:0)

最后经过大量的思考和调整......结果证明是 MARS 配置的问题!!

MARS在我们最新的重构代码(我认为EF的默认行为)中打开了,因为它在Linq中没有出现在sql连接字符串中。

删除&#34; MultipleActiveRecordSets = True;&#34;从连接字符串它工作正常。不知道为什么删除MARS有效。

希望它能帮助将来遇到类似问题的人。