Entity framework 实体框架存储过程调用明显较慢
我使用实体框架的性能显著降低的原因是什么?下面两个版本的代码都实现了完全相同的目标 Excel文档中有1700条记录正在插入到SQL Azure数据库中 使用实体框架执行时间:4:55Entity framework 实体框架存储过程调用明显较慢,entity-framework,Entity Framework,我使用实体框架的性能显著降低的原因是什么?下面两个版本的代码都实现了完全相同的目标 Excel文档中有1700条记录正在插入到SQL Azure数据库中 使用实体框架执行时间:4:55 foreach (IXLRow row in wb.Worksheet(1).RowsUsed()) { dbContext.InsertQuestion(row.Cell("B").Value.ToString().Trim(), row.Cell("A").Value.ToString().Trim(
foreach (IXLRow row in wb.Worksheet(1).RowsUsed())
{
dbContext.InsertQuestion(row.Cell("B").Value.ToString().Trim(), row.Cell("A").Value.ToString().Trim(), row.Cell("C").Value.ToString().Trim(), row.Cell("D").Value.ToString().Trim(), null);
}
非实体框架执行时间:1:54
foreach (IXLRow row in wb.Worksheet(1).RowsUsed())
{
using (SqlCommand cmd = new SqlCommand("InsertQuestion", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@CategoryName", row.Cell("B").Value.ToString().Trim()));
cmd.Parameters.Add(new SqlParameter("@TypeName", row.Cell("A").Value.ToString().Trim()));
cmd.Parameters.Add(new SqlParameter("@Text", row.Cell("C").Value.ToString().Trim()));
cmd.Parameters.Add(new SqlParameter("@Answer", row.Cell("D").Value.ToString().Trim()));
cmd.ExecuteNonQuery();
}
}
首先,在数据库上创建一个数据类型(就像数据库有VARCHAR和INT类型一样,您可以创建自己的类型。) 其次,将新类型用作存储过程的参数
CREATE PROCEDURE InsertSurveyAnswers
@Answers SurveyAnswerType READONLY
AS
INSERT INTO Answers
(CategoryName, TypeName, [Text], Answer)
SELECT CategoryName, TypeName, [Text], Answer
FROM @Answers
GO
第三,通过加载与新类型类似的表,从C#代码调用存储的过程:
DataTable tAnswers = new DataTable();
tAnswers.Columns.Add("CategoryName", typeof(String));
tAnswers.Columns.Add("TypeName", typeof(String));
tAnswers.Columns.Add("Text", typeof(String));
tAnswers.Columns.Add("Answer", typeof(String));
var rows = wb.Worksheet(1).RowsUsed();
var totalRows = rows.Count();
int index = 0;
int bufferSize;
using (SqlCommand cmd = new SqlCommand("InsertAnswers", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@SurveyAnswerType",
SqlDbType.Structured));
while(index < totalRows)
{
int bufferSize = Math.Min(200, totalRows - index);
foreach (index = index; index < bufferSize; index++)
{
var newRow = tAnswerstAnswers.NewRow();
newRow[0] = rows[index].Cell("A").Value.ToString().Trim();
newRow[1] = row[index].Cell("B").Value.ToString().Trim();
newRow[2] = row[index].Cell("C").Value.ToString().Trim();
newRow[3] = row[index].Cell("D").Value.ToString().Trim();
tAnswerstAnswers.AddRow(newRow);
}
cmd.Parameters["@SurveyAnswerType"].Value = tAnswers;
cmd.ExecuteNonQuery();
}
}
DataTable tAnswers=newdatatable();
添加(“CategoryName”,typeof(String));
添加(“TypeName”,typeof(String));
tAnswers.Columns.Add(“Text”,typeof(String));
tAnswers.Columns.Add(“应答”,typeof(字符串));
var rows=wb.Worksheet(1.RowsUsed();
var totalRows=rows.Count();
int指数=0;
int缓冲区大小;
使用(SqlCommand cmd=newsqlcommand(“InsertAnswers”,conn))
{
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.Add(新的SqlParameter(“@SurveyAnswerType”),
SqlDbType.Structured);
while(索引
注意事项:
- SqlParameter使用SqlDbType.Structured
- 连接只打开和关闭/破坏一次,而不是一次
每行 - 您应该使用缓冲区大小来查看最佳大小
- 您必须提出自己的实体框架版本
这-但我怀疑你每次打电话都会有开销 将使用此模式最小化
DataTable tAnswers = new DataTable();
tAnswers.Columns.Add("CategoryName", typeof(String));
tAnswers.Columns.Add("TypeName", typeof(String));
tAnswers.Columns.Add("Text", typeof(String));
tAnswers.Columns.Add("Answer", typeof(String));
var rows = wb.Worksheet(1).RowsUsed();
var totalRows = rows.Count();
int index = 0;
int bufferSize;
using (SqlCommand cmd = new SqlCommand("InsertAnswers", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@SurveyAnswerType",
SqlDbType.Structured));
while(index < totalRows)
{
int bufferSize = Math.Min(200, totalRows - index);
foreach (index = index; index < bufferSize; index++)
{
var newRow = tAnswerstAnswers.NewRow();
newRow[0] = rows[index].Cell("A").Value.ToString().Trim();
newRow[1] = row[index].Cell("B").Value.ToString().Trim();
newRow[2] = row[index].Cell("C").Value.ToString().Trim();
newRow[3] = row[index].Cell("D").Value.ToString().Trim();
tAnswerstAnswers.AddRow(newRow);
}
cmd.Parameters["@SurveyAnswerType"].Value = tAnswers;
cmd.ExecuteNonQuery();
}
}