2011-04-29 25 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