首先让我先说我对Linq没有完全的了解。我试图动态查询数据库,第一个查询使用LINQ-SQL工作正常,但第二个动态调用是运行时失败的
public void getTables()
{
foreach (var c in dc.GetTable<TableListing>())
{
List<TableData> res = tableBrowse(c.TableName);
}
}
public List<TableData> tableBrowse(string tablename)
{
string sql = "Select * from " + tablename;
var results = dc.ExecuteQuery<TableData>(sql);
return results.ToList();
}
public class TableData
{
public int Time { get; set; }
public string Value { get; set; }
}
我查询“主表”,这将检索要查询的表列表。它们都具有相同的结构,如TableData类中所定义。我收到有关Specified cast的运行时错误无效。我不是在寻找代码,因为我正在寻找我做错了什么以及如何修复它。感谢。
答案 0 :(得分:2)
您可以尝试使用ColumnAttributes修饰类属性,指定列名和类型,以便LINQ to SQL知道如何将列数据的版本用于属性。您可能还需要设置其他属性属性以使其正常工作。我还会在SQL中指定列名而不是使用*。将列名称与属性出现在类中的顺序相同,因为我认为它以与定义属性相同的顺序处理结果值。不确定这是否有效,但基本上你正在重新设计设计师会为你做的事情。
public List<TableData> tableBrowse(string tablename)
{
string sql = "Select [time], [value] from " + tablename;
var results = dc.ExecuteQuery<TableData>(sql);
return results.ToList();
}
public class TableData
{
[Column( Name="Time", DbType="DateTime NOT NULL", ... )]
public int Time { get; set; }
[Column( Name="Value", DbType="VARCHAR(255) NOT NULL", ... )]
public string Value { get; set; }
}
答案 1 :(得分:1)
您没有明确地将返回值从dc.ExecuteQuery<TableData>(sql)
转换为您定义的TableData
类型。我希望ExecuteQuery抱怨,因为它不知道TableData
类型是什么。
ExecuteQuery
帮助程序需要返回数据库中定义的DBML(LINQ-to-SQL生成)类型。
但我建议你不要走这条路。如果你想从表中获取记录,比如客户,只需使用content.Customers
- LINQ-to-SQL的要点就是它已经包含了所有这些访问器以节省你的时间。
答案 2 :(得分:0)
实际上我发现问题是什么,我错过了一个表定义。其中一个表中有第三种数据类型。一旦我定义了该表类并检查了数据类型,它就可以正常工作。可悲的是,编译器只是没有提供有关错误的信息。