2

Я использую Entity Framework для доступа к моей базе данных, и я просто понял, что сопоставление хранимых процедур с методами, использующими сущность, является слишком сложным и, вероятно, не очень подходит для того, чтобы делать то, что я хочу получить. Я новичок в LINQ, и мне интересно, лучше ли мне с ADO.NET. Вот SQL-код мне нужно перевести:LINQ to Entities вместо хранимой процедуры?

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 

При отображении Entities для хранимых процедур, у меня был этот код написан:

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]', , но для этого словаря требуется модель ite m типа '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> Cheers!

0

Вы можете написать простой запрос 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?) Литье.