如何得到Linq to Sql 动态生成的sql文等信息。
技术小牛 2011-05-24 09:20:27 如题:我想在代码中得到linq表达式生成的Sql文,并把它显示到winform的界面上。于是我用了如下方法
[MyName("筛选出UnitPrice 大于10 或已停产的产品")]
public IQueryable LearnSample1_4()
{
var q = from p in dbContext.Products
where p.UnitPrice > 10 || p.Discontinued
select p;
return q;
}
用反射来执行这个方法,因为我有很多的这种方法,都定义生返回IQueryable,以便在datagridview上能绑定显示出结果。如下:
//myDB是这个MyNorwindContext myDB =new MyNorwindContext(Console.Out);
//上面那个方法在MyNorwindContext这个类里面
MethodInfo mInfo = myDB.GetType().GetMethod(this.cmbMethod.Text);
IQueryable query = (IQueryable)mInfo.Invoke(myDB, null);
this.dataGridView1.DataSource = query;
//显示linq表达式
this.rtbx_LinqExpress.Text = query.Expression.ToString();
//显示SQL文
this.rtbx_SQL.Text = query.ToString();
上面这样做没有问题。现在我再练习添加下面的方法是就行不通了。如下:
public IQueryable LearnSample1_6()
{
var q = dbContext.Shippers.First();
return q;//???问题:q不是IQueryable,没法返回
}
强行改成这样
public IQueryable LearnSample1_6()
{
var q = dbContext.Shippers.First();
List<Shippers> lstData = new List<Shippers>();
lstData.Add(q);
return lstData.AsQueryable();//编译倒是过了,也统一了IQueryable 接口,但是却得不到sql文了
}
也就是:
this.rtbx_LinqExpress.Text = query.Expression.ToString();
//显示SQL文
this.rtbx_SQL.Text = query.ToString();
这两句得不到要得东西了。不知我说的明白不,我现在想问的是:当类似于这种var q = dbContext.Shippers.First();
的时候,该如何得到他生成的SQL文。各位有没有好的方法呀。