简体   繁体   English

Linq查询“特定的转换无效”

[英]Linq query “specific cast is not valid”

Following Linq to datatable query gives me error Specific cast is not valid . 跟着Linq到数据表查询给我错误特定的转换无效

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

Can any one suggest me why? 有人可以建议我为什么吗?

You should be able to just return a decimal straight from Select() . 您应该能够直接从Select()返回decimal

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

You don't need to create anonymous type: 您无需创建匿名类型:

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

You are trying to cast anonymous type to decimal, which of course will not work. 您正在尝试将匿名类型转换为十进制,这当然是行不通的。 Do not create anonymous type - simply select decimal value: 不创建匿名类型-只需选择十进制值即可:

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

Same with Linq methods syntax: 与Linq方法语法相同:

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

How to make your code work? 如何使您的代码正常工作? Use Select instead of Cast : 使用Select而不是Cast

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

But again, you don't need anonymous type to select single value. 但是同样,您不需要匿名类型来选择单个值。

Your projection ( Select ) creates instances of anonymous type like this: 您的投影( Select )将创建匿名类型的实例,如下所示:

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

...which instances can't be casted to decimal. ...哪些实例不能转换为十进制。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM