2009-09-09 9 views
4

Considérons une classe utilisée pour représenter les résultats d'un GroupBy(). Le but du code est de remplacer une procédure stockée qui aurait regroupé et compté un groupe de lignes par le champ Created datetime.Linq To Sql: Le membre Date n'a pas de traduction prise en charge vers SQL

public class Statistic 
{ 
    public int NumRecords { get; set; } 
    public DateTime Date { get; set; } 
} 

est ici le code soulevant une exception/avertissement:

//returning an IEnumerable<Statistic> 
return db.MyTable 
      .GroupBy(x => x.CreatedOn.Date) //precision of date, not time. 
      .Select(x => new Statistic(x.Key, x.Count())) //custom object 
      .OrderBy(x => x.Date); 

L'exception:

La date de membre n'a pas encore pris en charge traduction SQL

Quand je refactoriser le code à charger dans un var , l'exception/l'avertissement est généré sur le OrderBy().

Question: Comment puis-je éviter cette exception en utilisant Linq To Sql?

Répondre

1

Il s'avère que la requête n'a pas été exécutée et chargée dans une variable quand je l'avais attendu.

Les éléments suivants seront évalués et fonctionneront comme prévu.

IEnumerable<Statistic> stats = db.MyTable   
     .GroupBy(x => x.CreatedOn.Date) 
     .Select(x=> new Statistic(x.Key, x.Count())); 


    return stats.OrderBy(x=>x.Date); 
8

J'ai déjà rencontré ce problème avant d'utiliser le constructeur par défaut. Si vous utilisez un lieu object initializer, à Sql peut Linq comprendre la mise en correspondance:

return db.MyTable 
      .GroupBy(x => x.CreatedOn.Date) //precision of date, not time. 
      .Select(x => new Statistic{Date = x.Key, NumRecords = x.Count()}) //custom object 
      .OrderBy(x => x.Date); 
+0

C'est exactement ce que je cherchais. Je vous remercie! – Andy