Linq Select *来自Table ExecuteQuery

时间:2009-08-31 11:27:52

标签: c# linq

首先让我先说我对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的运行时错误无效。我不是在寻找代码,因为我正在寻找我做错了什么以及如何修复它。感谢。

3 个答案:

答案 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)

实际上我发现问题是什么,我错过了一个表定义。其中一个表中有第三种数据类型。一旦我定义了该表类并检查了数据类型,它就可以正常工作。可悲的是,编译器只是没有提供有关错误的信息。