2010-11-17 7 views
0

Il me semble que ce fut dur ...LINQ to SQL Commande de méthode externe

var MostRated = (from p in db.Posts 
           let AverageRating = CalculateAverageRatingFromPost(p) 
           where p.PostStatus == Convert.ToInt32(PostStatusEnum.Published.Value) && p.IsDeleted == false 
           orderby p.PublishedDate descending 
           select new 
           { 
            PostUrl = Common.PostUrl(p.Section.Name, p.Permalink), 
            Title = Common.TrimString(p.Title, 50), 
            Excerpt = Common.TrimString(p.Excerpt, 80), 
            AverageRate = CalculateAverageRating((from pr in db.Ratings 
                where pr.ObjectType == Convert.ToInt32(ObjectTypeEnum.Post.Value) && pr.ObjectID == p.ID 
                select pr).SingleOrDefault()), 
            PublishedDate = new DateHelper().DateTimeInWords(p.PublishedDate.Value) 
           }).OrderByDescending(o => o.AverageRate).Take(5).ToList(); 

et l'autre méthode est

private Decimal CalculateAverageRating(Rating pr) 
     { 
      if (pr != null) 
      { 
       Decimal Average = ((1 * (Decimal)pr.Star1) + (2 * (Decimal)pr.Star2) + (3 * (Decimal)pr.Star3) + (4 * (Decimal)pr.Star4) + (5 * (Decimal)pr.Star5))/((Decimal)pr.Star1 + (Decimal)pr.Star2 + (Decimal)pr.Star3 + (Decimal)pr.Star4 + (Decimal)pr.Star5); 
       return Average; 
      } 
      else 
      { 
       return 0; 
      } 
     } 

Je reçois cette erreur de temps d'exécution « de traduction pris en charge pas à SQL ". Ce que je veux, c'est obtenir des listes de messages, et faire un petit calcul rapide de la note, puis trier ceux du plus haut au plus bas et prendre 5 posts seulement.

Merci

Répondre

1

Je n'ai pas testé, mais essayer de définir la fonction comme un objet d'expression.

Expression<Rating, Decimal> CalculateAverageRating = 
    pr => (Decimal)(
     pr == null ? 0 : 
     (pr.Star1 + 2*pr.Star2 + 3*pr.Star3 + 4*pr.Star4 + 5*pr.Star5) 
     /(pr.Star1 + pr.Star2 + pr.Star3 + pr.Star4 + pr.Star5)); 
+0

J'ai essayé de déclarer ceci mais cela n'a pas fonctionné ... Expression prendre seulement 1 paramètre ... Expression Taha