2011-04-29 27 views
11

我有一个LINQ查询,看起来像这样扔无效转换异常:LINQ在BIGINT

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: 指定从物化 '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

一个匿名对象根本不使用反射。它根据'ClientDataID'的返回类型在编译时推断类型。 – vcsjones 2011-04-29 01:34:42

+0

@vcsjones:更重要的是,为什么这是令人困惑的:P 但是,谢谢你纠正我。 – KTF 2011-04-29 13:18:23

回答

0

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

+0

这是我检查的第一件事情之一。我将不得不在明天再次检查,但我确定我已将它设置为bigint。 – KTF 2011-04-29 02:40:54

+0

Yeup,果然 - 在EDMX的这个领域的属性中,我把它当作一个Int64 ...任何其他想法? – KTF 2011-05-02 16:03:29

+0

不是。你最好的选择可能是问问http://social.msdn.microsoft.com/Forums/en-NZ/adodotnetentityframework/ – 2011-05-02 20:43:03

18

短语“物化值”是指从数据存储检索到的值。

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

你在前面把(Int32)石膏(可能)被转换到数据存储(SQL Server中,这意味着像CAST([columnName] AS int),因此,实体框架是现在期待得到一个int而不是long

不投,它期待long,但得到的int

的解决方法是改变EDMX文件或更改列,因此,在EDMX文件相匹配的数据类型数据键入数据库。

(jhott)

+0

但是什么是解决方案瑞安 – Mohit 2014-09-25 08:37:34

+1

我已经添加了一个句子给我的答案,解释了如何解决问题。 – Ryan 2014-09-25 13:50:46

+0

谢谢它适合我,Upvoted – Mohit 2014-09-26 03:35:23

1

在我的存储过程,我回来row numberrowcount,我把它强制转换为int,现在正常工作。

CAST (TotalCount AS INT)TotalCount