【问题标题】:LINQ to Entities instead of stored procedure?LINQ to Entities 而不是存储过程?
【发布时间】:2012-03-23 04:53:14
【问题描述】:

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

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

【问题讨论】:

    标签: c# linq entity-framework stored-procedures entity-framework-4


    【解决方案1】:

    您可以编写一个简单的 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?) 强制转换很重要。

    【讨论】:

      【解决方案2】:

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

      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&lt;NHLStats2.Models.ListLeagueLeaders_Result&gt; 干杯!

      【讨论】:

        猜你喜欢
        • 2015-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多