LINQ to Entities вместо хранимой процедуры? - PullRequest
2 голосов
/ 17 декабря 2011

Я использую 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'.

Но я понимаю, что это немного мучительно? & * @ ... Как я мог бы перестроить это, используя другой, более эффективный метод? Спасибо за вашу помощь, это очень ценится.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2011

Наконец, выбирая хранимую процедуру, она компилируется и работает:

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 голосов
/ 18 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...