Linq to Sql Query - 更好的解决方案(优化)

时间:2012-02-01 08:39:33

标签: linq linq-to-sql dictionary query-optimization

以下代码有效,但它不是一个很好的代码。 (低绩效)

我有一本有价值和关键字的字典。

首先,我要通过存在的每个网络摄像头。然后我加载列表中的所有参与者(其中webcode等于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;

TIA

2 个答案:

答案 0 :(得分:0)

你需要这些内容:

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(); 

我无法测试它,但这是您需要的查询类型。

答案 1 :(得分:0)

这将假设您在数据库中定义了关系,并且您的LINQ to SQL datacontext知道它们。如果没有,您将需要从tWebcode手动加入t_Participants。

这应该在1个单独的SQL查询中执行,而不是在tWebcode中每行执行1次查询。

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);