C# LINQ到实体而不是存储过程?
我正在使用实体框架访问我的数据库,我刚刚发现将存储过程映射到使用实体的方法有点太复杂了,可能不太适合做我想做的事情。我是LINQ的新手,我想知道如果我只使用ADO.NET是否会更好。以下是我需要翻译的SQL代码:C# LINQ到实体而不是存储过程?,c#,linq,entity-framework,stored-procedures,entity-framework-4,C#,Linq,Entity Framework,Stored Procedures,Entity Framework 4,我正在使用实体框架访问我的数据库,我刚刚发现将存储过程映射到使用实体的方法有点太复杂了,可能不太适合做我想做的事情。我是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
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;
}
HockeyStatEntities db=新的HockeyStatEntities();
公共行动结果索引()
{
ViewBag.Message=“联盟领袖”;
{
返回视图(db.ListLeagueLeaders());
}
}
关于()的公共行动结果
{
返回视图();
}
私人ICollection ListLeagueLeaders()
{
ICollection leagueLeadersCollection=null;
使用(hockeyStatEntities context=new hockeyStatEntities())
{
foreach(列表联盟领袖)\结果联盟领袖
context.ListLeagueLeaders())
{
leagueLeadersCollection.Add(leagueLeader);
}
}
返回LeagueLeaders集合;
}
以下是我得到的错误:
传递到字典中的模型项的类型为
'System.Data.Objects.ObjectResult'1[NHLStats2.Models.ListLeagueLeaders\u结果],
但此词典需要类型为的模型项
“NHLStats2.Models.ListLeagueLeaders_结果”
但我意识到这对我来说有点痛苦。。。我如何使用不同的、更有效的方法来重新安排?感谢您的帮助,非常感谢。您可以编写一个简单的LINQ查询,使用具有以下两个表的模型,保持它们之间的关系:
from p in ctx.Dim_Player
select new {p.Player_id, p.Name, Goals = p.Fact_Statstics.Select(x=>(int?)x.Goals).Sum()}
玩家将拥有FactStatistics属性和相关统计信息。可以使用所需的总和和计数应用子查询
上面的查询返回的是匿名类型,但您可以创建具有所需属性的类
使用(int?)cast很重要。您可以编写一个简单的LINQ查询,使用带有这两个表的模型,保持它们的关系:
from p in ctx.Dim_Player
select new {p.Player_id, p.Name, Goals = p.Fact_Statstics.Select(x=>(int?)x.Goals).Sum()}
玩家将拥有FactStatistics属性和相关统计信息。可以使用所需的总和和计数应用子查询
上面的查询返回的是匿名类型,但您可以创建具有所需属性的类
使用(int?)cast很重要。最后选择使用存储过程,它编译并工作: Model1.tt.Context.cs(自动生成)
public DbSet Dim_Date{get;set;}
公共DbSet Dim_播放器{get;set;}
公共DbSet Dim_团队{get;set;}
公共数据库集事实统计{get;set;}
公共DbSet Dim_对策{get;set;}
公共虚拟对象结果ListLeagueLeaders()
{
((IObjectContextAdapter)this.ObjectContext.MetadataWorkspace.LoadFromAssembly(typeof(ListLeagueLeaders_Result).Assembly);
返回((IObjectContextAdapter)this.ObjectContext.ExecuteFunction(“ListLeagueLeaders”);
}
查看
@model System.Data.Objects.ObjectResult<NHLStats2.Models.ListLeagueLeaders_Result>
@{
ViewBag.Title = "Index";
}
[...]
@model System.Data.Objects.ObjectResult
@{
ViewBag.Title=“Index”;
}
[...]
问题在于强类型视图类型与System.Data.Objects.ObjectResult类型不匹配。Was:
@model NHLStats2.Models.listleague leaders_Result
,更改为:@model System.Data.Objects.ObjectResult
干杯 最后选择使用存储过程,它编译并工作:
Model1.tt.Context.cs(自动生成)
public DbSet Dim_Date{get;set;}
公共DbSet Dim_播放器{get;set;}
公共DbSet Dim_团队{get;set;}
公共数据库集事实统计{get;set;}
公共DbSet Dim_对策{get;set;}
公共虚拟对象结果ListLeagueLeaders()
{
((IObjectContextAdapter)this.ObjectContext.MetadataWorkspace.LoadFromAssembly(typeof(ListLeagueLeaders_Result).Assembly);
返回((IObjectContextAdapter)this.ObjectContext.ExecuteFunction(“ListLeagueLeaders”);
}
查看
@model System.Data.Objects.ObjectResult<NHLStats2.Models.ListLeagueLeaders_Result>
@{
ViewBag.Title = "Index";
}
[...]
@model System.Data.Objects.ObjectResult
@{
ViewBag.Title=“Index”;
}
[...]
问题在于强类型视图类型与System.Data.Objects.ObjectResult类型不匹配。Was:@model NHLStats2.Models.listleague leaders_Result
,更改为:@model System.Data.Objects.ObjectResult
干杯