Приведение к типу значения "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, когда он может анализировать / не соответственно.
В вашей программе перед использованием анализируемого значения проверьте, является ли оно допустимым или нет.