访问 IQueryable 后面的 DataContext

12

是否有可能访问IQueryable后面的DataContext对象?

如果可以,如何实现?

1个回答

14

DataContext 是针对 LINQ to SQL 特定的,所以你大概是在谈论 LINQ to SQL 查询?如果是这样,没有安全的方法可以做到这一点 - 你必须采用反射等 hack 方法来检索底层 DataQuery 对象的私有 "context" 字段:

static DataContext GetContext (IQueryable q)
{
  if (!q.GetType().FullName.StartsWith ("System.Data.Linq.DataQuery`1")) return null;
  var field = q.GetType().GetField ("context", BindingFlags.NonPublic | BindingFlags.Instance);
  if (field == null) return null;
  return field.GetValue (q) as DataContext;
}

1
你提到这是一种黑客方式,但即使如此也不应该推荐使用。通过反射访问私有成员不是一个好的实践,它会产生脆弱的代码。这样做还会隐藏调用代码和DataContext类之间的依赖关系。 - Brent M. Spell
+1实际上可以用作“hack”的方式来访问上下文,当某人返回IQueryable时,就可以完全访问查询:) - Adam Tuliper
1
一个小的补充。System.Data.Linq.Table<> 也可能是 IQueryable 接口的背后。代码:string typeName = q.GetType().FullName;如果typeName不以"System.Data.Linq.DataQuery1"或"System.Data.Linq.Table1"开头,则返回null。 - Dmitry Dzygin
这能用于动态地告诉IQueryable使用不同的DataContext吗? - nitewulf50
@nitewulf50 当然可以,只需使用setter方法即可。 - AgentFire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接