C# 从LINQ DataContext中的表名获取表数据
我需要从LINQDataContext的表名中获取表数据 而不是这个C# 从LINQ DataContext中的表名获取表数据,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我需要从LINQDataContext的表名中获取表数据 而不是这个 var results = db.Authors; 我需要这样做 string tableName = "Authors"; var results = db[tableName]; 它可以是DataContext中可用的任何表名。我不确定传递字符串是否是一个优雅的解决方案。我宁愿将实体类型作为参数发送给方法。在这些方面: var table = _dataCont.GetTable(typeof(Customer));
var results = db.Authors;
我需要这样做
string tableName = "Authors";
var results = db[tableName];
它可以是DataContext中可用的任何表名。我不确定传递字符串是否是一个优雅的解决方案。我宁愿将实体类型作为参数发送给方法。在这些方面:
var table = _dataCont.GetTable(typeof(Customer));
是MSDN文档 我不确定我是否会建议它作为一个好的解决方案,但如果你真的需要它,你可以这样做:
MyDBContext db = new MyDBContext();
Type t = db.GetType();
PropertyInfo p = t.GetProperty("Authors");
var table = p.GetValue(db, null);
这将为您提供Authors表,如pr.table。给定
DataContext
和string tableName
,您可以说:
var table = (ITable)context.GetType()
.GetProperty(tableName)
.GetValue(context, null);
如果你知道类型,你可以将其转换。从
我需要使用字符串变量来获取表数据。因为按照设计,Linq2SQl不支持这一点。您将需要创建一个类似类型GetTableTypeFromString(string tableName)的方法;有一个switch语句并返回所需的表类型这将把
表
作为对象
;在使用之前,您需要强制转换到ITable
。您能否提供如何使用ITable将数据转换为IEnumerable或IQueryable?它已经是IEnumerable/IQueryable了。区别在于它不是泛型版本IEnumerable/IQueryable,因此不能对其使用强类型查询。但是您可以使用动态linq执行弱类型查询。这里有更多信息:并在这里下载:(您正在寻找dynamic.cs)ITable tbl=db.GetTableByName(“作者”);var data=(从tbl中的m选择m).ToList();我试过这样。。。但获取编译错误:错误1找不到源类型“System.Data.Linq.ITable”的查询模式的实现选择“未找到”。考虑显式指定范围变量“m”的类型。你不能这样使用它。正如我所说,这里不能使用强类型查询,因此必须使用foreach(var tblrow in tbl){}对每个元素进行迭代并执行if。或者,您可以查看动态Linq.Ok,ITable tbl=db.GetTableByName(“作者”);如何访问tbl以获取IEnumerable记录?一个ITable
也是一个IEnumerable
,因此使用您喜欢的方法(例如,foreach(tbl中的对象r){}
)枚举记录。但它不是强类型的。我如何动态转换它以获得强类型数据?这是不可能的。如果您想动态查找表名,那么您就失去了拥有强类型表的能力。为什么不单独发布代码示例的第9行呢?当然,任何需要这个问题答案的人都会理解如何进行空检查以及什么是扩展方法。你只是让别人更难在你的答案中找到有用的信息。
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);
}
}