Database of competition information
Try this one:

        var filteredResults =
        (from r in results             
         where r.Average &gt; 0 &amp;&amp;
               r.EventID == "333" &amp;&amp;
               r.RoundID == "f"
         select r).ToList();

        List&lt;Results&gt; bestResults = new List&lt;Results&gt;();            
        var resultsInCompenitions = filteredResults.GroupBy(r =&gt; r.CompetitionID);
        foreach (var resultsInCompetition in resultsInCompenitions)
        {
            var bestResultInCompetition = resultsInCompetition.OrderBy(r =&gt; r.Average).FirstOrDefault();
            if (bestResultInCompetition != null)
            {
                bestResults.Add(bestResultInCompetition);   
            }                
        }

        var femaleBestResults = 
            from r in bestResults
            join p in persons on r.PersonID equals p.ID
            where p.Gender == "f"
            select r;    

       return femaleBestResults;