在LINQ DataContext中从表名获取表数据

15

我需要从Linq DataContext中获取表名对应的表格数据。

不使用下面的方法:

var results = db.Authors;

我需要做类似这样的事情。

string tableName = "Authors";

var results = db[tableName];

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

4个回答

16

如果给定了DataContext contextstring tableName,你可以只需说:

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

好的,ITable tbl = db.GetTableByName("Authors"); 如何访问tbl以获取IEnumerable记录? - Krunal
1
一个 ITable 也是一个 IEnumerable,因此可以使用你喜欢的方法枚举记录(例如,foreach(object r in tbl) { })。 - jason
但它不是强类型的。我该如何动态地进行转换以获得强类型数据? - Krunal
这是不可能的。如果您想动态查找表名称,那么您就失去了具有强类型表的能力。 - jason
1
为什么不只是单独发布你代码示例的第9行呢?毫无疑问,任何需要这个问题答案的人都会知道如何进行空值检查以及什么是扩展方法。你只是让别人更难找到你回答中有用的信息。 - jwg

4

我不确定传递字符串是否是一个优雅的解决方案。我更愿意将实体类型作为参数发送到方法中。大致如下:

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

这里是MSDN文档的链接

我需要使用我的字符串变量来获取表格数据。 - Krunal
由于Linq2SQL的设计不支持此功能。你需要创建一个方法,例如Type GetTableTypeFromString(string tableName); 使用switch语句并返回所需的表类型。 - Perpetualcoder

3
我不确定我会建议它作为一个好的解决方案,但如果你真的需要它,你可以这样做:
MyDBContext db = new MyDBContext();
Type t = db.GetType();
PropertyInfo p = t.GetProperty("Authors");
var table = p.GetValue(db, null);

那将会给你一个作者表,按照表格格式呈现。

这将把 table 类型为一个 object 对象;在使用前需要将其强制转换成一个 ITable - jason
你能提供如何使用ITable来获取数据作为IEnumerable或IQueryable的方法吗? - Krunal
1
它已经是IEnumerable/IQueryable了。区别在于它不是泛型版本的IEnumerable<T>/IQueryable<T>,因此您无法在其上使用强类型查询。但是,您可以使用动态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
ITable tbl = db.GetTableByName("Authors"); var data = (from m in tbl select m).ToList();我尝试了这种方式...但是出现编译错误:错误1:无法找到源类型“System.Data.Linq.ITable”的查询模式实现。未找到“Select”。请考虑明确指定范围变量“m”的类型。 - Krunal
你好。你不能这样使用它。就像我说的,你不能在这里使用强类型查询,所以你需要使用foreach(var tblrow in tbl) {}来迭代并对每个元素执行if操作。或者,你可以考虑使用动态Linq。 - Terje

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);
    }
}

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