我正在使用实体框架来访问我的数据库,我只是想到将存储过程映射到使用实体的方法有点过于复杂,可能不太适合做我想要的事情。我是LINQ的新手,我想知道我是否可以通过ADO.NET做得更好。这是我需要翻译的SQL代码:
SELECT p.Player_id, p.Name, p.Position, SUM(s.Goals) AS goalsb, SUM(s.Assists) AS assistsb, SUM(s.Points) AS pointsb
FROM Dim_Player AS p INNER JOIN Fact_Statistics AS s ON s.Player_id = p.Player_id
GROUP BY p.Player_id, p.Name, p.Position
ORDER BY pointsb DESC, goalsb DESC
使用存储过程的实体映射,我编写了以下代码:
HockeyStatsEntities db = new HockeyStatsEntities();
public ActionResult Index()
{
ViewBag.Message = "League leaders";
{
return View(db.ListLeagueLeaders());
}
}
public ActionResult About()
{
return View();
}
private ICollection<ListLeagueLeaders_Result> ListLeagueLeaders()
{
ICollection<ListLeagueLeaders_Result> leagueLeadersCollection = null;
using (HockeyStatsEntities context = new HockeyStatsEntities())
{
foreach (ListLeagueLeaders_Result leagueLeader in
context.ListLeagueLeaders())
{
leagueLeadersCollection.Add(leagueLeader);
}
}
return leagueLeadersCollection;
}
以下是我遇到的错误:
传递到字典中的模型项是类型的 'System.Data.Objects.ObjectResult`1 [NHLStats2.Models.ListLeagueLeaders_Result]', 但是这个字典需要一个类型的模型项 'NHLStats2.Models.ListLeagueLeaders_Result'。
但我意识到这有点痛苦?&amp; * @ ...我怎么能用一种不同的,更有效的方法重新安排呢?感谢您的帮助,非常感谢。
答案 0 :(得分:0)
您可以使用包含这两个表的模型编写一个简单的LINQ查询,保持它们之间的关系:
from p in ctx.Dim_Player
select new {p.Player_id, p.Name, Goals = p.Fact_Statstics.Select(x=>(int?)x.Goals).Sum()}
您Dim_Player将具有FactStatistics属性及相关统计信息。您可以使用所需的SUM和COUNT来应用子查询。
上面的查询返回一个匿名类型,但您可以创建一个具有所需属性的类。
使用(int?)强制转换非常重要。
答案 1 :(得分:0)
最后选择使用存储过程,这会编译并运行:
Model1.tt.Context.cs (自动生成)
public DbSet<Dim_Date> Dim_Date { get; set; }
public DbSet<Dim_Player> Dim_Player { get; set; }
public DbSet<Dim_Team> Dim_Team { get; set; }
public DbSet<Fact_Statistics> Fact_Statistics { get; set; }
public DbSet<Dim_Game> Dim_Game { get; set; }
public virtual ObjectResult<ListLeagueLeaders_Result> ListLeagueLeaders()
{
((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace.LoadFromAssembly(typeof(ListLeagueLeaders_Result).Assembly);
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<ListLeagueLeaders_Result>("ListLeagueLeaders");
}
查看强>
@model System.Data.Objects.ObjectResult<NHLStats2.Models.ListLeagueLeaders_Result>
@{
ViewBag.Title = "Index";
}
[...]
问题在于强类型视图类型与System.Data.Objects.ObjectResult类型不匹配。是:@model NHLStats2.Models.ListLeagueLeaders_Result
,更改为:@model System.Data.Objects.ObjectResult<NHLStats2.Models.ListLeagueLeaders_Result>
干杯!