2009-12-17 42 views
13

我需要从Linq DataContext的表名中获取表数据。从LINQ DataContext中的表名获取表数据

取而代之的是

var results = db.Authors; 

我需要做这样的事情。

string tableName = "Authors"; 

var results = db[tableName]; 

它可以是任何在DataContext中可用的表名。

回答

15

鉴于DataContext contextstring tableName,你可以说:

var table = (ITable)context.GetType() 
          .GetProperty(tableName) 
          .GetValue(context, null); 
+0

好吧,ITable tbl = db.GetTableByName(“Authors”);如何访问tbl以获取IEnumerable记录? – Krunal 2009-12-18 06:56:48

+1

一个'ITable'也是一个'IEnumerable',所以用你最喜欢的方法枚举记录(例如,'foreach(object in rbl){}')。 – jason 2009-12-18 12:46:45

+0

但它不是强类型。我怎样才能动态地强制类型化数据? – Krunal 2009-12-21 05:02:40

4

我不确定传递字符串是否是一个优雅的解决方案。我宁愿将实体类型作为参数发送给方法。这些行上的东西:

var table = _dataCont.GetTable(typeof(Customer)); 

Here是MSDN文档。

+0

我需要使用我的字符串变量来获取表数据。 – Krunal 2009-12-17 08:11:51

+0

由于设计Linq2SQl不支持。您需要创建一个类似于GetTableTypeFromString(string tableName)的方法;有一个switch语句并返回所需的表类型 – Perpetualcoder 2009-12-17 16:08:14

3

我不知道我会建议它作为一个很好的解决方案,但如果你真的需要它,你可以做这样的事情:

MyDBContext db = new MyDBContext(); 
Type t = db.GetType(); 
PropertyInfo p = t.GetProperty("Authors"); 
var table = p.GetValue(db, null); 

这会给你Authors表,公关。表。

+0

这将键入'table'作为'object';你需要在使用前投射到“ITable”。 – jason 2009-12-18 03:39:04

+0

您能否提供如何使用ITable将数据获取为IEnumerable或IQueryable? – Krunal 2009-12-18 06:52:27

+1

它已经是一个IEnumerable/IQueryable。区别在于它不是泛型版本IEnumerable /IQueryable ,因此您不能在其上使用强类型查询。但是你可以使用Dynamic linq来执行弱类型的查询。更多信息在这里:http://www.beansoftware.com/ASP.NET-Tutorials/Dynamic-LINQ.aspx并在此处下载:http://code.msdn.microsoft.com/csharpsamples/Release/ProjectReleases.aspx? ReleaseId = 8(你正在寻找dynamic.cs) – Terje 2009-12-18 19:06:03

0

如果你知道类型,你可以施放它。从http://social.msdn.microsoft.com/Forums/en-US/f5e5f3c8-ac3a-49c7-8dd2-e248c8736ffd/using-variable-table-name-in-linq-syntax?forum=linqprojectgeneral

MyDataContext db = new MyDataContext(); 
Assembly assembly = Assembly.GetExecutingAssembly(); 
Type t = assembly.GetType("Namespace." + strTableName); 
if (t != null) 
{ 
    var foos = db.GetTable(t); 

    foreach (var f in foos) 
    { 
     PropertyInfo pi = f.GetType().GetProperty("Foo"); 
     int value = (int)pi.GetValue(f, null); 
     Console.WriteLine(value); 
    } 
}