我比较了从数据库表中获取一些相当大的数据的两个查询。对于查询一个,我使用 Linq To Sql,而对于另一个我通过 ADO.NET 使用 passthrough SQL。
我知道 Linq To Sql 在幕后要做很多工作,但它到底在做什么呢?这两个查询获取相同数量的数据,但 Linq To Sql 查询慢了 5 秒以上,并且使用了 150mb 以上的 RAM!
这是我的测试代码:
使用 Linq 到 Sql :
public void MakeList()
{
int start = Environment.TickCount;
var document = from d in _dm.tDokuments select d;
List<tDokument> documentList = document.ToList();
int end = Environment.TickCount;
GridView1.DataSource = documentList;
GridView1.DataBind();
Label1.Text = (end - start).ToString();
}
直通 SQL + ADO.NET:
public void MakeList()
{
int start = Environment.TickCount;
SqlCommand sqlCommand = new SqlCommand("SELECT * FROM tDokument", _connection);
SqlDataAdapter da = new SqlDataAdapter(sqlCommand);
DataSet ds = new DataSet();
da.Fill(ds);
int end = Environment.TickCount;
GridView1.DataSource = ds;
GridView1.DataBind();
Label1.Text = (end - start).ToString();
}
最佳答案
Linq2Sql 正在返回强类型对象,其中数据集填充了本质上相当于哈希表的内容。
在 Linq 中,数据的填充和数据与 GridView 的绑定(bind)使用大量反射来生成所需的结果。
在第二段代码中,数据被加载到数据集中并绑定(bind)到 GridView。这本质上是加载一个带有数据和查找绑定(bind)的哈希表。
哈希表操作总是比反射快。对于少量数据,不会有明显的差异,但对于大量数据,您会看到 Linq 中反射的影响。
关于sql - 为什么 Linq To Sql 数据绑定(bind)到 gridview 比传递 SQL 慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1779220/