LINQ在bigint上抛出无效的强制转换异常

时间:2011-04-29 01:27:35

标签: linq linq-to-entities

我有一个看起来像这样的LINQ查询:

var clintLst = (from clntDt in ent.ClientDatas
                where clntDt.CompanyName.Substring(0,searchWord.Length).Equals(searchWord, StringComparison.CurrentCultureIgnoreCase)
                orderby clntDt.CompanyName
                select new { ClientDataID = clntDt.ClientDataID,
                    CompanyName = clntDt.CompanyName, 
                    ContactName = (clntDt.ContactFirstName + " " + clntDt.ContactLastName),
                    CompanyLocation = clntDt.Location.LocationCity.CityName + ", " + clntDt.Location.LocationState.StateCode
                } ).Distinct().Take(10);

然而,它抛出了以下异常:

  

来自物化的指定演员表   'System.Int32'类型为   'System.Int64'类型无效。 [..]   例外细节:   System.InvalidOperationException:The   物化的指定演员   'System.Int32'类型为   'System.Int64'类型无效。

     

源文件:   C:\ TempPersonalCode \ TransportTracking \ TransportTracking \ TransportTracking \控制器\ AJAXController.cs   行:35

(第35行是select子句)

我很困惑,因为如果改变:

select new { ClientDataID = clntDt.ClientDataID,
    CompanyName = clntDt.CompanyName, 

select new { ClientDataID = (Int32)clntDt.ClientDataID,
    CompanyName = clntDt.CompanyName, 

然后它工作正常。是不是一个匿名对象应该使用反射来确定它的类型?如果是这样,为什么它决定它是“Int32”而不是长?在EDMX中,我把它作为Int64。

3 个答案:

答案 0 :(得分:18)

短语“具体化值”是指从数据存储中检索的值。

可能发生的事情是数据库将该列配置为int,但在您的EDMX文件中,它是long(或Int64)。

你放在前面的(Int32)强制转换(可能)被转换为数据存储(在SQL Server中,这意味着像CAST([columnName] AS int),因此,实体框架现在期待获得int而不是long

如果没有演员,它会期待long,但会获得int

解决方案是更改EDMX文件或更改列,以便EDMX文件中的数据类型与数据库中的数据类型匹配。

(jhott)

答案 1 :(得分:1)

在我的存储过程中,我正在返回row numberrowcount,我将其转换为int,现在它正常运行。

CAST (TotalCount AS INT)TotalCount

答案 2 :(得分:0)

似乎从实体框架中抛出异常。您可能会在SSDL文件中将列设置为int而不是bigint