繁体   English   中英

LINQ to Entities而不是存储过程?

[英]LINQ to Entities instead of stored procedure?

我正在使用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;
}

这是我得到的错误:

传递到字典中的模型项的类型为“ System.Data.Objects.ObjectResult`1 [NHLStats2.Models.ListLeagueLeaders_Result]”,但是此字典需要模型项为“ NHLStats2.Models.ListLeagueLeaders_Result”。

但是我意识到,这对?&* @ ...有点痛苦。我该如何使用其他更有效的方法来重新安排呢? 感谢您的帮助,我们非常感谢。

您可以使用带有这两个表的模型编写一个简单的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?)强制转换很重要。

最后选择使用存储过程,此方法可以编译并运行:

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>干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM