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

KTF*_*KTF 11 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);
Run Code Online (Sandbox Code Playgroud)

但是,它抛出以下异常:

从物化的"System.Int32"类型到"System.Int64"类型的指定强制转换无效.[..]异常详细信息:System.InvalidOperationException:从实现的"System.Int32"类型到"System.Int64"类型的指定强制转换无效.

源文件:C:\ TempPersonalCode\TransportTracking\TransportTracking\TransportTracking\Controllers\AJAXController.cs Line:35

(第35行是select子句)

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

select new { ClientDataID = clntDt.ClientDataID,
    CompanyName = clntDt.CompanyName, 
Run Code Online (Sandbox Code Playgroud)

select new { ClientDataID = (Int32)clntDt.ClientDataID,
    CompanyName = clntDt.CompanyName, 
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*yan 18

短语"具体化值"是指从数据存储中检索的值.

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

(Int32)您放在前面的演员阵容(可能)被翻译到数据存储区(在SQL Server中,这意味着类似的东西CAST([columnName] AS int),因此,实体框架现在期望得到一个int而不是一个long.

没有演员阵容,它会期待一场long比赛int.

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

(jhott)


Mar*_*ade 0

该异常似乎是从实体框架引发的。您可能将列设置为int而不是bigintSSDL 文件中的列。