2

私はデータベースにアクセスするためにEntity Frameworkを使用していますが、エンティティを使用するメソッドにストアドプロシージャをマッピングするのは少し複雑すぎて、おそらくexacltlyを実行するのに適していないと思いました。私はLINQが新しく、ADO.NETだけで良いと思っていますか?ここで私は翻訳する必要があるSQLコードは次のとおりです。ストアドプロシージャの代わりにエンティティへのLINQ?

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」です。

しかし、私はこれが少し痛みであることを認識していますか? & * @ ...どうすれば別のより効果的な方法でこれを並べ替えることができますか?助けてくれてありがとう、本当に感謝しています。

答えて

0

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

0

あなたは彼らの関係を保ち、これらの2つのテーブルとモデルを使用して、簡単な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?)キャストを使用することが重要です。

最後に、これはコンパイルし、作品のストアドプロシージャを使用してを選ぶ
関連する問題