【发布时间】:2017-06-13 02:21:52
【问题描述】:
在这里发疯了,但是有一个我想转换为 Dictionary 对象的 LINQ 查询,但得到一个“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 是指定的整数)。我以前没有使用过这种方法(w/LINQ to SQL),所以我认为缺少一些东西。 (它适用于非 SQL 的东西)
在不同的表上尝试了相同的代码并得到了结果(没有错误)。 看起来问题出在 Product 表中的空值(varchar() 空值 - 所以错误消息完全关闭 - 也许是一个错误?)
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 );
}
【问题讨论】:
-
Product中的一个变量可能是 int 但 linq 试图将其转换为字符串?我对来自 mysql 数据库的布尔值有类似的问题(它将它们存储为 1 和 0,通常很好,但对于一些 linq 查询,它拒绝正确进行转换) -
我怀疑使用
ToList()而不是ToDictionary会在您的第一个查询中导致同样的错误。如果这是真的,则映射定义中有错误。 -
尝试跟随:Dictionary
> result = context.Products.GroupBy(x => x.ProductName.Substring(0,1)).ToDictionary(x => x.键,y => y.Prod_ID.ToList());错了三件事。 1)您的密钥是字符串而不是整数,因为它以字母开头。 2)由于多个产品可以以 N 开头,因此您的字典是一个列表。 3)你在构建字典时使用 GroupBy -
密钥是 DB 和 DBML 中的一个整数(并照此映射)(它是自动生成的,但我验证它是)。我没有进行任何类型的分组 - 内部查询返回一个 Product 列表。不确定在这种情况下分组是什么意思。我只是希望 prod_ID 成为 Key,Product 对象成为 Value。
标签: c# linq dictionary linq-to-sql