这是我想写的方法:
public static IEnumerable<String> GetTableNames(this IQueryable<T> query)
{
//...
}
其中IQueryable是一个linq-to-sql查询(我应该使用更具体的接口吗?)。
然后如果我有这样的查询
var q = from c in db.Customers
from p in db.Products
from cp in db.CustomerProducts
where c.ID = 3 && cp.CustID == c.ID && p.ID == cp.ProdID
select new {p.Name, p.Version};
q.GetTableNames();// return ["Customers", "Products", "CustomerProducts"]
基本上它会显示此查询在db中触及的所有表,可以执行查询来解决这个问题(因为无论如何都会发生这种情况)?任何想法?
(编辑:对不起,如果这有点太“给我代码!”,任何提示,部分解决方案或解释为什么这是不可能的将被视为谢谢!-Luke)
答案 0 :(得分:1)
LINQ-to-SQL允许您轻松捕获TSQL - 只需设置.Log
即可。那么问题是解析它。我将诱惑捕获TSQL,并使用SET STATISTICS IO ON
在SSMS中播放它 - 这样可以轻松解析每个表的结果。
答案 1 :(得分:0)
你可以做DataContext.GetCommand(query).CommandText
,然后解析寻找FROM和JOIN子句(棘手的是笛卡尔(逗号)连接)。