Linq to Sql Query - лучшее решение (оптимизация) - PullRequest
0 голосов
/ 01 февраля 2012

Следующий код работает, но это не очень хороший код. (низкая производительность)

У меня есть словарь со значением и ключом.

Сначала я расскажу о всех существующих веб-кодах. Затем я загружаю всех участников в список (где веб-код равен фактическому веб-коду в foreach). После этого я добавляю данные (параметр веб-кода и количество участников в словарь).

        Guid compID = Guid.Parse(wID);
        ChartModel webcodes = new ChartModel();
        webcodes.Title = "Webcodes Statistics";
        webcodes.Data = new Dictionary<string, int>();

        var webcodesData = db.t_Webcode;

        foreach (var w in webcodesData)
        {
            var wData = db.t_Participant.Where(t => t.FK_Competition == compID && t.Webcode == w.Webcode);

            if (wData.Count() != 0)
                webcodes.Data.Add(w.Parameter, wData.Count());
        }

        ViewBag.Webcodes = webcodes;

ТИА

Ответы [ 2 ]

0 голосов
/ 01 февраля 2012

Это предполагает, что у вас есть определенные отношения в вашей базе данных, и что ваш текст данных LINQ to SQL знает о них.Если нет, вам нужно будет вручную присоединиться к t_Participants из tWebcode.

Это должно выполняться в 1 отдельном запросе SQL вместо 1 запроса на строку в tWebcode.

var webcodesAndNoOfParticipants = 
    from webcode in db.tWebcode

    // Define number of participants for this webcode
    let numberOfParticipants = webcode.t_Participants.Count(participant => participant.FK_Competition == compID)

    where numberOfParticipants > 0
    select new {
        WebcodeParameter = webcode.Parameter,
        NoOfParticipants = numberOfParticipants 
    };

webcodes.Data = webcodesAndNoOfParticipants.ToDictionary(x => x.WebcodeParameter, x => x.NoOfParticipants);
0 голосов
/ 01 февраля 2012

Вам нужно что-то вроде этого:

webcodes.Data = (from w in db.t_Webcode 
        join p in db.t_Participant on w.Webcode equals p.Webcode 
        where p.FK_Competition == compID 
        group w by w.Parameter into g 
        select new { g.Key, Count = g.Count() }).ToDictionary(); 

Я не могу проверить это, но вам нужен именно такой запрос.

...