我有一个看起来像这样的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。
答案 0 :(得分:18)
短语“具体化值”是指从数据存储中检索的值。
可能发生的事情是数据库将该列配置为int
,但在您的EDMX文件中,它是long
(或Int64
)。
你放在前面的(Int32)
强制转换(可能)被转换为数据存储(在SQL Server中,这意味着像CAST([columnName] AS int)
,因此,实体框架现在期待获得int
而不是long
。
如果没有演员,它会期待long
,但会获得int
。
解决方案是更改EDMX文件或更改列,以便EDMX文件中的数据类型与数据库中的数据类型匹配。
(jhott)
答案 1 :(得分:1)
在我的存储过程中,我正在返回row number
和rowcount
,我将其转换为int
,现在它正常运行。
CAST (TotalCount AS INT)TotalCount
答案 2 :(得分:0)
似乎从实体框架中抛出异常。您可能会在SSDL文件中将列设置为int
而不是bigint
。