LINQ到实体而不是存储过程

本文关键字:存储过程 实体 LINQ | 更新日期: 2023-09-27 18:18:21

我正在使用实体框架访问我的数据库,我刚刚发现将存储过程映射到使用实体的方法有点太复杂,可能不太适合做我想做的事情。我是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"。

但我意识到这是有点痛苦的?&*@…我怎样才能用一种不同的、更有效的方法来重新安排呢?谢谢你的帮助,真的很感激。

LINQ到实体而不是存储过程

您可以编写一个简单的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和COUNTs应用子查询。

上面的查询返回一个匿名类型,但是您可以创建一个具有所需属性的类。

使用(int?)强制转换是很重要的。

最后选择使用存储过程,它编译并工作:

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");
    }
<<p> 视图/strong>
@model System.Data.Objects.ObjectResult<NHLStats2.Models.ListLeagueLeaders_Result>
@{
    ViewBag.Title = "Index";
}
[...]

问题是强类型视图类型与system . data . objects . objectreresult类型不匹配。原:@model NHLStats2.Models.ListLeagueLeaders_Result,改为:@model System.Data.Objects.ObjectResult<NHLStats2.Models.ListLeagueLeaders_Result>干杯!