[英]Left outer join gives error message 'Unable to cast the type 'System.Nullable`1' to type 'System.Object'.'
[英]Unable to cast the type 'System.Nullable`1' to type '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灯具
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
这是我的整体结构,我得到上述错误。我用谷歌搜索,但我没有得到一个确切的解决方案。 任何帮助都非常感谢。
感谢所有人帮助我,特别感谢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进行字符串转换并使其正常工作。 谢谢大家。
代替:
<% foreach (var item in ViewData["Fixtures"] as IEnumerable<DataAccess.FixtureModel>)
尝试:
<% foreach (var item in Model)
还尝试使用.ToList()
方法急切地加载您的实体:
ViewData["Fixtures"] = fixtures.ToList();
您也可以考虑使用视图模型而不是ViewData
。 它将使您的代码更清晰,您将不再依赖魔术字符串 。
更新:
试试这个:
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 + ""
});
尝试重写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查询基本相同,但我在最后一个可以转换为SQL的条件(即Where(...))和seasionID btw的类型和值之间放置了一个AsEnumerable()调用? )和Select(...)。
原因是我认为L2S试图将Select(..)转换为SQL。 不确定它会起作用,但值得一试。
在控制器中使用它:
ViewData["Fixtures"] = fixtures.ToArray();
我不确定,但我认为这就是你的问题所在。 如果您不使用ToArray ,那么您将向视图发送IQueryable ,这可能会有问题。
给这个一个镜头...(虽然id调整try尝试捕获,如果你最终使用它。我不建议抑制错误,不做任何事情/让它死于沉默的死亡; P)
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.