2013-06-21 6 views
2

Я не могу на всю жизнь выяснить, в чем проблема. Каждый раз, когда запрос переходит к выполнению «ToList()», я получаю ошибку выше.Недопустимое значение для значения типа 'Int32', потому что материализованное значение равно нулю

Вот больше информации о нем:

<Error> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
The cast to value type 'Int32' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type. 
</ExceptionMessage> 
<ExceptionType>System.InvalidOperationException</ExceptionType> 
<StackTrace> 
at System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal) at System.Data.Common.Internal.Materialization.Shaper.GetColumnValueWithErrorHandling[TColumn](Int32 ordinal) at lambda_method(Closure , Shaper) at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext() at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at TVDataWebAPI.Controllers.ETSShowsController.GetETSShows(String title, String episodeTitle, String genre, String showTypeDescription, String directorName, String releaseYear, String seasonEpisode) in c:\Users\rarbex\Documents\Visual Studio 2012\Projects\TVDataWebAPI\TVDataWebAPI\Controllers\ETSShowsController.cs:line 83 at lambda_method(Closure , Object , Object[]) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<>c__DisplayClass5.<ExecuteAsync>b__4() at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken) 
</StackTrace> 
</Error> 

public IEnumerable<ETSShows> GetETSShows(string title = null, 
{ 
    string episodeTitle = null, string genre = null, 
    string showTypeDescription = null, 
    string directorName = null, 
    string releaseYear = null, 
    string seasonEpisode = null) 
    { 
     IQueryable<ETSShows> query = from shows in db.ETS_Shows 
     from episodes in db.ETS_Episodes.Where(v => v.ShowId == shows.ShowId).DefaultIfEmpty() 
     from genres in db.ETS_LKP_Genres.Where(s => s.GenreCode == shows.GenreCode).DefaultIfEmpty() 
     from showTypes in db.ETS_LKP_ShowTypes.Where(z => z.ShowTypeCode == shows.ShowTypeCode).DefaultIfEmpty() 
     from directors in db.ETS_Directors.Where(p => p.ShowId == shows.ShowId).DefaultIfEmpty() 
     select new ETSShows 
     { 
     dataSource = "ETS", 
     Title = shows.Title, 
     EpisodeId = episodes.EpisodeId, 
     EpisodeTitle = episodes.EpisodeTitle, 
     GenreDescription = genres.GenreDescription, 
     ShowTypeDescription = showTypes.ShowTypeDescription, 
     Name = directors.Name, 
     ReleaseYear = (int) shows.ReleaseYear, 
     SeasonEpisode = episodes.SeasonEpisode, 
     ShowId = shows.ShowId 
     }; 
    } 
} 

public class ETSShows 
{ 
    public string dataSource { get; set; } 
    public string Title { get; set; } 
    public int EpisodeId { get; set; } 
    public string EpisodeTitle { get; set; } 
    public string GenreDescription { get; set; } 
    public string ShowTypeDescription { get; set; } 
    public string Name { get; set; } 
    public int ReleaseYear { get; set; } 
    public string SeasonEpisode { get; set; } 
    public int ShowId { get; set; } 
} 
+1

Возможный дубликат [Приведенный тип значения «Int32» не выполнен, потому что материализованное значение равно null] (http://stackoverflow.com/questions/6864311/the-cast-to-value-type-int32-failed- потому что-materialized-value-is-null) – Rawling

ответ

8

Я предполагаю, что этот вопрос находится здесь:

ReleaseYear = (int) shows.ReleaseYear 

Почему вы должны бросить shows.ReleaseYear к int? Это потому, что это еще не int? Может быть, это на самом деле Nullable<int>?

int не может содержать значение null, и ошибка говорит вам, что он встречается значение null в данных, так что значение не может быть приведен к int.

Вам необходимо либо изменить свои данные, чтобы не допустить null значения для этого поля, или изменить тип к Nullable<int> (или int? для краткости).

+1

+1 для обозначения типов с нулевым значением. – Brian

+0

Спасибо. Все, что я сделал, это добавить «?» для класса Shows для этой переменной. –

6

Он говорит вам прямо там:

Актерский к типу значения «Int32» не удалось потому материализованная значение равно нулю.

Это виновный линия:

ReleaseYear = (int) shows.ReleaseYear, 

Проверьте свои данные и убедитесь, что все имеет ReleaseYear, или переключиться на использование int?.

2

Если вы получаете нулевые значения, то попробуйте использовать эти методы для литья -

Convert.ToInt32 (строку), Это будет возвращать 0, если значение используется для синтаксического анализа является недействительным.

Int32.TryParse (string, out int), это вернет true/false, когда он сможет разобрать/не соответствовать.

В вашей программе перед употреблением анализируемого значения проверьте, действительно ли это или нет.