简单骗过DataContext,统计Linq to SQL执行查询的次数
2008-09-26 22:22
387 查看
Linq to SQL带有一些缓存,可以复用一些查询,有时候我们为了测试和评价系统需要知道我们进行了几次数据查询,为了这个,我想到一个很损的方法。
DataContext类有一个类型为TextWriter的属性Log,当执行了SQL的时候,会向这个TextWriter里写入所执行的SQL,还有参数等相关信息,经过观察发现,它实际上调用到的只是一个WriteLine(string)方法,所以我弄了个TextWriterWrapper类,继承TextWriter,重写WriteLine(string)方法,在这里面来让查询次数+1;
但是这时候会遇到很郁闷的问题,那就是有很多时候因为要输出参数信息,DataContext会分多行往这里面写东西,又是经过观察发现,除了SQL以外, 别的行都会以“--”开头,这样邪恶的方法就产生了。
public class TextWriterWrapper : TextWriter {
public override void WriteLine(string value) {
if (!value.StartsWith("--")) {
queryCount++;
}
}
public override Encoding Encoding {
get { return Encoding.Default; }
}
public int QueryCount {
get { return queryCount; }
}
private int queryCount;
}
需要统计一个DataContext的SQL查询次数的时候,就靠这个Wrapper就骗了它,还真是损啊。这也很好地体现了面向接口、面向抽象编程的魅力!
其实这个Wrapper可以达到的作用远不止这点,还可以方便的记录查询日志,DataContext给Log的信息实在太简单,我们可以通过这个Wrapper来包装一下,对执行的SQL进行一些记录,可以方便对其进行观察和调试——当然,对于后者,我还是更建议使用专门的调试器来进行。
DataContext类有一个类型为TextWriter的属性Log,当执行了SQL的时候,会向这个TextWriter里写入所执行的SQL,还有参数等相关信息,经过观察发现,它实际上调用到的只是一个WriteLine(string)方法,所以我弄了个TextWriterWrapper类,继承TextWriter,重写WriteLine(string)方法,在这里面来让查询次数+1;
但是这时候会遇到很郁闷的问题,那就是有很多时候因为要输出参数信息,DataContext会分多行往这里面写东西,又是经过观察发现,除了SQL以外, 别的行都会以“--”开头,这样邪恶的方法就产生了。
public class TextWriterWrapper : TextWriter {
public override void WriteLine(string value) {
if (!value.StartsWith("--")) {
queryCount++;
}
}
public override Encoding Encoding {
get { return Encoding.Default; }
}
public int QueryCount {
get { return queryCount; }
}
private int queryCount;
}
需要统计一个DataContext的SQL查询次数的时候,就靠这个Wrapper就骗了它,还真是损啊。这也很好地体现了面向接口、面向抽象编程的魅力!
其实这个Wrapper可以达到的作用远不止这点,还可以方便的记录查询日志,DataContext给Log的信息实在太简单,我们可以通过这个Wrapper来包装一下,对执行的SQL进行一些记录,可以方便对其进行观察和调试——当然,对于后者,我还是更建议使用专门的调试器来进行。
相关文章推荐
- 步步为营VS 2008 + .NET 3.5(9) - DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- 步步为营VS 2008 + .NET 3.5(9) - DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- 是否会成为问题——Linq to Sql的执行可能无法复用查询计划
- LINQ to SQL系列 查询 使用LINQ to SQL做简单查询
- 直接执行查询和命令(LINQ TO SQL)
- 步步为营VS 2008 + .NET 3.5(9) - DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)
- [转载代码]VB.NET 中查询 Linq to SQL 执行时的SQL语句
- DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- 直接执行查询和命令(LINQ TO SQL)
- 步步为营VS 2008 + .NET 3.5(9) - DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- LINQ to SQL 简单查询
- 9、步步为营VS 2008 + .NET 3.5(9) - DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- LINQ TO SQL:直接执行查询和命令
- 是否会成为问题——Linq to Sql的执行可能无法复用查询计划
- DLINQ(LINQ to SQL)之执行SQL语句的添加、查询、更新和删除
- 是否会成为问题——Linq to Sql的执行可能无法复用查询计划
- LINQ to Sql系列二 简单查询和联接查询
- LINQ to Sql系列二 简单查询和联接查询
- LINQ to SQL系列 查询 使用LINQ to SQL做简单查询