Невозможно ввести тип "System.Nullable`1" для ввода "System.Object" - ASP.NET MVC

ОШИБКА

Unable to cast the type 'System.Nullable`1' to type 'System.Object'.
 LINQ to Entities only supports casting Entity Data Model primitive types.

Это ошибка, которую я получаю.

Контроллер -

 public ActionResult FixturesAll()
 {
     teamMgr = new TeamManager();
     fixtureMgr = new FixtureManager();

     var team = teamMgr.GetTeams();
     var viewModel = new TeamIndexViewModel()
     {
          Teams = team.ToList(),
          NumberOfTeams = team.Count()
     };

     var fixtures = from fixtures in Oritia_entities.Fixtures
                    where fixtures.SeasonId == seasionID
                    select new FixtureModel
                    {

                        Team1 = "",
                        Team2 = "",
                        Winners = (fixtures.TeamWon+""),
                        FirstBattingTeam = (fixtures.FirstBattingTeam+""),
                        SecondBattingTeam = (fixtures.SecondBattingTeam+""),
                        Team1Score = fixtures.Team1Score + "",
                        Team1Wickets = fixtures.Team1Wickets + "",
                        Team2Score = fixtures.Team2Score + "",
                        Team2Wickets = fixtures.Team2Wickets + ""
                    };

      ViewData["Fixtures"] = fixtures;
      return View(viewModel);
 }

Частичный вид

<%@ Control Language="C#" Inherits=
"System.Web.Mvc.ViewUserControl<IEnumerable<DataAccess.FixtureModel>>" %>
    <table>
    <% foreach (var item in ViewData["Fixtures"]
 as IEnumerable<DataAccess.FixtureModel>) // Here I am getting the error
       { %>
          <tr>                 
            <td>
                <%: item.Team1 %>
            </td>
            <td>
                <%: item.Team2 %>
            </td>
          </tr>
   </table>

Просмотр

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
 Inherits="System.Web.Mvc.ViewPage<FunBox.ViewModels.TeamIndexViewModel>" %>
<ul>
    <% foreach (string team in Model.Teams)
       { %>
           <li><a href="<%: team.ToString() %>/">
           <%: team.ToString()  %></a> </li>
    <% } %>
</ul>

<div>
        <% Html.RenderPartial("FixturesAll",ViewData["Fixtures"]); %>
    </div>

Сложные классы

 public class TeamIndexViewModel
 {
     public int NumberOfTeams { get; set; }
     public List<String> Teams { get; set; }
 }

 public class FixtureModel
 {
     public string Team1 { get; set; }
     public string Team2 { get; set; }
     public string Winners { get; set; }
     public string Team1Score { get; set; }
     public string Team1Wickets { get; set; }
     public string Team2Score { get; set; }
     public string Team2Wickets { get; set; }
     public string FirstBattingTeam { get; set; }
     public string SecondBattingTeam { get; set; }
 }

Выход sp_help Fixtures

Id          bigint (pk)
TeamID1     bigint
TeamID2         bigint
TeamWon         bigint
Date            datetime
SeasonId    bigint
ManOfTheMatch   bigint
FirstBattingTeam    bigint
SecondBattingTeam   bigint
ResultDescription   nvarchar
Team1Score  bigint
Team2Score  bigint
Team1Wickets    bigint
Team2Wickets    bigint

Это моя общая структура, и я получаю вышеуказанную ошибку. Я искал googled, но я не получил точное решение для этого. Любая помощь приветствуется.

Спасибо всем за то, что помогли мне и моей особой благодарностью Jon Skeet за предоставленную идею

См. мой обновленный запрос

 var data = from fixtures in Oritia_entities.Fixtures
                   join t1 in Oritia_entities.Teams on new { ID = fixtures.TeamID1 } equals new { ID = t1.ID }
                   join t2 in Oritia_entities.Teams on new { ID = fixtures.TeamID2 } equals new { ID = t2.ID }
                   where fixtures.SeasonId == seasionID
                   select new FixtureModel
                   {
                       Team1 = t1.TeamName,
                       Team2 = t2.TeamName,

                       Winners = SqlFunctions.StringConvert((double)(fixtures.TeamWon ?? 1)),
                       FirstBattingTeam = SqlFunctions.StringConvert((double)(fixtures.FirstBattingTeam ?? 1)),
                       SecondBattingTeam = SqlFunctions.StringConvert((double)(fixtures.SecondBattingTeam ?? 1)),
                       Team1Score = SqlFunctions.StringConvert((double)(fixtures.Team1Score ?? 1)),
                       Team1Wickets = SqlFunctions.StringConvert((double)(fixtures.Team1Wickets ?? 1)),
                       Team2Score = SqlFunctions.StringConvert((double)(fixtures.Team2Score ?? 1)),
                       Team2Wickets = SqlFunctions.StringConvert((double)(fixtures.Team2Wickets ?? 1))

                   };

Я использовал SqlFunctions.StringConvert для конвертирования в строку и давал ей возможность работать. Спасибо всем.

Ответ 1

Вместо:

<% foreach (var item in ViewData["Fixtures"] as IEnumerable<DataAccess.FixtureModel>)

попробовать:

<% foreach (var item in Model)

Также старайтесь загружать объекты с помощью метода .ToList():

ViewData["Fixtures"] = fixtures.ToList();

Также вы можете использовать модели просмотра вместо ViewData. Это сделает ваш код намного чище, и вы больше не будете полагаться на магические строки.


UPDATE:

Попробуйте следующее:

var fixtures = Oritia_entities
    .Fixtures
    .Where(f => f.SeasonId == seasionID)
    .ToList()
    .Select(f => new FixtureModel
    {
        Team1 = "",
        Team2 = "",
        Winners = (f.TeamWon+""),
        FirstBattingTeam = (f.FirstBattingTeam+""),
        SecondBattingTeam = (f.SecondBattingTeam+""),
        Team1Score = f.Team1Score + "",
        Team1Wickets = f.Team1Wickets + "",
        Team2Score = f.Team2Score + "",
        Team2Wickets = f.Team2Wickets + ""
    });

Ответ 2

Попробуйте переписать запрос LINQ:

var fixtures = Oritia_entities.Fixtures
    .Where(fixtures => fixtures.SeasonId == seasionID)
    .AsEnumerable()
    .Select(fixtures => new FixtureModel
                    {

                        Team1 = "",
                        Team2 = "",
                        Winners = (fixtures.TeamWon+""),
                        FirstBattingTeam = (fixtures.FirstBattingTeam+""),
                        SecondBattingTeam = (fixtures.SecondBattingTeam+""),
                        Team1Score = fixtures.Team1Score + "",
                        Team1Wickets = fixtures.Team1Wickets + "",
                        Team2Score = fixtures.Team2Score + "",
                        Team2Wickets = fixtures.Team2Wickets + ""
                    }
    )
    .ToList();

Запрос LINQ в основном тот же, но я поставил вызов AsEnumerable() между последними критериями, которые могут быть переведены на SQL (это Where (...)), и каков тип и значение seasionID btw?) и Select (...).

Причина в том, что я думаю, что L2S каким-то образом пытается перевести Select (..) в SQL. Не уверен, что это сработает, но стоит попробовать.

Ответ 3

Используйте это в контроллере:

  ViewData["Fixtures"] = fixtures.ToArray();

Я не уверен, но я думаю, что там, где ваша проблема. Если вы не используете ToArray, то вы отправляете IQueryable в представление, что может быть проблематичным.

Ответ 4

Дайте этот снимок... (хотя идентификатор tweak try catch немного, если вы в конечном итоге его используете. Я бы не рекомендовал подавлять ошибку и ничего не делать об этом/позволить ей умереть безмолвной смерти; р)

 public string NullableObjectToString(object obj)
 {
      try
      {
          if (obj == null)
              return "";

          return (obj ?? string.Empty).ToString();
      }
      catch (Exception)
      {
          return "";
      }
  }

Тогда

var fixtures = from fixtures in Oritia_entities.Fixtures
                  where fixtures.SeasonId == seasionID
                  select new FixtureModel
                  {                        
                     Winners = NullableObjectToString(fixtures.TeamWon),
                     FirstBattingTeam = NullableObjectToString(fixtures.FirstBattingTeam) // ..... you get the idea
                  }