我正在使用 Entity Framework 来访问我的数据库,我只是发现使用实体将存储过程映射到方法有点太复杂,可能不太适合做我想做的事情。我是 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;
}
这是我遇到的错误:
The model item passed into the dictionary is of type 'System.Data.Objects.ObjectResult`1[NHLStats2.Models.ListLeagueLeaders_Result]', but this dictionary requires a model item of type 'NHLStats2.Models.ListLeagueLeaders_Result'.
但我意识到这在 ?&*@... 中有点痛苦,我怎样才能使用不同的、更有效的方法重新安排它?感谢您的帮助,非常感谢。
最佳答案
您可以编写一个简单的 LINQ 查询,使用具有这 2 个表的模型,并保持它们的关系:
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?) 转换很重要。
关于c# - LINQ to Entities 而不是存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8543261/