Linq查询“指定的强制转换无效”

时间:2013-01-22 10:25:33

标签: c# linq-to-dataset

Linq to datatable 查询后出现错误特定演员无效

decimal[] temp = dt.AsEnumerable()
    .Select(r => new
       {
           totLen = r.Field<decimal>("Quantity") 
                     * (r.Field<decimal>("Breath") 
                         * r.Field<decimal>("Length"))
       })
    .Cast<decimal>()
    .ToArray();

任何人都可以建议我为什么?

4 个答案:

答案 0 :(得分:1)

您应该可以直接从decimal返回Select()

decimal[] temp = dt.AsEnumerable().Select(
    r => r.Field<decimal>("Quantity") * (r.Field<decimal>("Breath") * r.Field<decimal>("Length")
)).ToArray();

答案 1 :(得分:1)

您无需创建匿名类型:

decimal[] temp = dt.AsEnumerable()
    .Select(r => r.Field<int>("Quantity") 
               * r.Field<decimal>("Breath") 
               * r.Field<decimal>("Length"))
    .ToArray();

答案 2 :(得分:1)

您正在尝试将匿名类型转换为十进制,这当然不起作用。不要创建匿名类型 - 只需选择十进制值:

decimal[] temp = (from r in dt.AsEnumerable()
                  select r.Field<decimal>("Quantity") * 
                         r.Field<decimal>("Breath") * 
                         r.Field<decimal>("Length")).ToArray();

与Linq方法语法相同:

decimal[] temp = dt.AsEnumerable()
                   .Select(r => r.Field<decimal>("Quantity") * 
                                r.Field<decimal>("Breath") * 
                                r.Field<decimal>("Length"))
                   .ToArray();

如何使您的代码有效?使用Select代替Cast

.Select(x => x.totLen).ToArray();

但同样,您不需要匿名类型来选择单个值。

答案 3 :(得分:0)

您的投影(Select)会创建匿名类型的实例,如下所示:

class SomeAnonymousClass
{
   public totLen { get; set; }
}

...哪些实例无法转换为十进制。