Невозможно ввести тип "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
}