Приведение к типу значения "Int32" не удалось, так как материализованное значение равно null
Я ни за что на свете не могу понять, в чем тут дело. Каждый раз, когда запрос идет на выполнение " ToList ()", я получаю ошибку выше.
Вот еще информация об этом:
<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:UsersrarbexDocumentsVisual Studio 2012ProjectsTVDataWebAPITVDataWebAPIControllersETSShowsController.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; }
}
3 ответа:
Я предполагаю, что проблема здесь:
ReleaseYear = (int) shows.ReleaseYear
Почему вы должны бросить
shows.ReleaseYear
вint
? Потому что это еще неint
? Может быть, это на самом делеNullable<int>
?An
int
не может содержать значениеnull
, и ошибка говорит вам, что он столкнулся со значениемnull
в данных, так что значение не может быть приведено кint
.Вам нужно либо изменить данные, чтобы не разрешать значения
null
для этого поля, либо изменить тип наNullable<int>
(илиint?
для короткий).
Он говорит вам прямо там:
Приведение к типу значения 'Int32' завершилось ошибкой, поскольку материализованное значение равно null .
Это оскорбительная строка:
Проверьте свои данные и убедитесь, что все имеет ReleaseYear, или переключитесь на использованиеReleaseYear = (int) shows.ReleaseYear,
int?
.
Если вы получаете нулевые значения, то попробуйте использовать эти методы для приведения -
Преобразование.ToInt32 (string), это вернет 0, если значение, используемое для синтаксического анализа, равно null.
Int32.TryParse (string, out int), это будет возвращать true / false, когда он может анализировать / не соответственно.
В вашей программе перед использованием анализируемого значения проверьте, является ли оно допустимым или нет.