KTF
KTF

Reputation: 1379

LINQ throwing invalid cast exception on a bigint

I have a LINQ query that looks something like this:

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);

However, it is throwing the following exception:

The specified cast from a materialized 'System.Int32' type to the 'System.Int64' type is not valid. [..] Exception Details: System.InvalidOperationException: The specified cast from a materialized 'System.Int32' type to the 'System.Int64' type is not valid.

Source File: C:\TempPersonalCode\TransportTracking\TransportTracking\TransportTracking\Controllers\AJAXController.cs Line: 35

(Line 35 is the select clause)

I'm confused because if change:

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

to

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

then it works fine. Isn't an anonymous object supposed to use reflection to determine it's type? if so, why is it deciding that it's an "Int32" instead of a long? Within the EDMX I have it as an Int64.

Upvotes: 11

Views: 12532

Answers (3)

Ghadir Farzaneh
Ghadir Farzaneh

Reputation: 458

In my stored procedure, I was returning row number and rowcount, I casted it to int and it works properly now.

CAST (TotalCount AS INT)TotalCount

Upvotes: 2

Ryan
Ryan

Reputation: 2998

The phrase "materialized value" refers to the value that was retrieved from the data store.

What's probably happening is that the database has that column configured as an int, but in your EDMX file it's a long (or Int64).

The (Int32) cast you're putting on the front is (probably) being translated to the data store (in SQL Server, this means something like CAST([columnName] AS int), and consequently, the Entity Framework is now expecting to get an int instead of a long.

Without the cast, it's expecting a long but getting an int.

The solution is to either change the EDMX file or change the column, so that the data type in the EDMX file matches the data type in the database.

(jhott)

Upvotes: 19

Mark Cidade
Mark Cidade

Reputation: 100047

The exception seems to be thrown from the Entity Framework. You might have the column set as int instead of bigint in the SSDL file.

Upvotes: 0

Related Questions