LINQ ToDictionary System.InvalidCastException:'无法将'System.Int32'类型的对象强制转换为'System.String'。'

时间:2017-06-13 02:21:52

标签: c# linq todictionary

在这里疯狂,但有一个LINQ查询,我想转换为Dictionary对象,但得到一个“System.InvalidCastException:'无法将'System.Int32'类型的对象强制转换为'System.String'。 “这样做时出错,所以我很难过。只有当我只想使用Key并使用Product类作为值时才会发生这种情况。

ProductsDataContext context = new ProductsDataContext();

Dictionary<int, Product> result = context.Products.Where(x => x.ProductName.StartsWith("N")).ToDictionary(x => x.Prod_ID); 

Prod_ID是类和数据库中的整数。无处应该转换为字符串,所以我对此错误消息感到难过。

如果我写这样的话:

Dictionary<int, string> result = context.Products.Where(x => x.ProductName.StartsWith("N")).ToDictionary(x => x.Prod_ID, x=> x.ProductName)

它工作正常,没有数据转换错误消息(Key是指定的整数)。我之前没有使用过这种方法(带有LINQ to SQL),所以我认为缺少了一些东西。 (它适用于非SQL的东西)

在不同的表上尝试相同的代码并获得结果(没有错误)。 看起来问题是Product表中的空值(varchar()nulls - 所以错误消息完全关闭 - 可能是一个错误?)

    StylesDataContext context = new StylesDataContext();

    Dictionary<int,Style> results = context.Styles.Select(x => x).Where(x => x.style_name.EndsWith("d")).ToDictionary(x => x.style_id);
    foreach (KeyValuePair<int, Style> r in results)
    {
        Console.WriteLine("id: " + r.Key.ToString()  + "\tName: " + r.Value.style_name + "\tGUID: " + r.Value.style_bvin  );
    }

2 个答案:

答案 0 :(得分:1)

请尝试以下代码:

ProductsDataContext context = new ProductsDataContext();
var r1 = context.Products.Where(x => x.ProductName.StartsWith("N"));
var r2 = r1.ToDictionary(x => x.Prod_ID);

r1或r2是否发生错误?如果您使用VS保持变量名称来查看每个var语句使用的类型。产品的Enumerable似乎可能会产生错误。

答案 1 :(得分:0)

这个特定问题的答案是,不知何故,Visual Studio 2017破坏了LINQ-to-SQL类的一部分自动生成的代码(我没有做任何改动)。删除这些类并将其添加回来解决了有关此查询的错误消息的问题。

我推测数据已损坏或表中存在空值导致问题不正确。

我运行了一个硬盘扫描,看看数据是否已经通过我的电脑损坏了,但是它恢复了干净。

如果再次发生这种情况,我将确保运行完整的逐个文件比较,以查看实际损坏的部分,并将其发布到MS Dev团队。如果这是一个错误,那就是一个可怕的,浪费时间的错误。