2008-12-01 11 views
2

i obtenir cette erreurPourquoi l'erreur "La méthode n'a pas pris en charge la traduction vers SQL"?

{"Method 'System.DateTime ConvertTimeFromUtc(System.DateTime, System.TimeZoneInfo)' has no supported translation to SQL."} 

lorsque je tente d'exécuter cette LINQ to SQL

var query = from p in db.Posts 
      let categories = GetCategoriesByPostId(p.PostId) 
      let comments = GetCommentsByPostId(p.PostId) 
      select new Subnus.MVC.Data.Model.Post 
      { 
       Categories = new LazyList<Category>(categories), 
       Comments = new LazyList<Comment>(comments), 
       PostId = p.PostId, 
       Slug = p.Slug, 
       Title = p.Title, 
       CreatedBy = p.CreatedBy, 
       CreatedOn = TimeZoneInfo.ConvertTimeFromUtc(p.CreatedOn, TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time")), 
       Body = p.Body 
      }; 
return query; 

est-il un autre endroit où je peux convertir la date en format j'ai actuellement une macro i mon _global. étincelle fil mais qui semble mal

<macro name="DateAndTime" Date="DateTime"> 
# Date = TimeZoneInfo.ConvertTimeFromUtc(Date, TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time")); 
${Date.ToString("MMMM d, yyyy")} at ${Date.ToString("hh:mm")} 
</macro> 
<macro name="Date" Date="DateTime"> 
# Date = TimeZoneInfo.ConvertTimeFromUtc(Date, TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time")); 
${Date.ToString("MMMM d, yyyy")} 
</macro> 

Mise à jour: Je comprends maintenant où le code ne fonctionne pas, mais WHE n je le supprimer je reçois alors même erreur pour ce code

public IQueryable<Subnus.MVC.Data.Model.Comment> GetCommentsByPostId(int postId) 
    { 
     var query = from c in db.Comments 
        where c.PostId == postId 
        select new Subnus.MVC.Data.Model.Comment 
        { 
         Body = c.Body, 
         EMail = c.EMail, 
         Date = c.CreatedOn, 
         WebSite = c.Website, 
         Name = c.Name 
        }; 

     return query; 
    } 

Répondre

1

LINQ to SQL se traduit par un sous-ensemble des opérations - et d'essayer (et à défaut) pour écrire ConvertTimeFromUtc comme TSQL. Certaines opérations ont des homologues TSQL (dateadd/datediff/etc) - mais pas toutes. Vous pouvez choisir de faire votre projection (select) en utilisant la valeur brute, et ne faire que ConvertTimeFromUtc une fois que vous avez l'objet en mémoire (via LINQ-to-Objects). Par exemple - vous pouvez créer les objets en utilisant p.CreatedOn, puis faire le reste par la suite. Pas idéal, mais la vie. LINQ-to-Entities revendique de meilleures options de traduction, mais est nettement plus complexe. En fonction de votre scénario, LINQ-to-SQL offre également un support udf, qui parfois vous permet de décharger ces choses à la db - si il existe un moyen de l'écrire comme un udf - par exemple, vous pouvez écrire une méthode sur les données-contexte et la marque est en fonction composable ([Function]), alors quelque chose comme:

... 
    CreatedOn = ctx.MapDate(p.CreatedOn) 
.... 

qui utiliseraient alors la TSQL de [Function] - à savoir quelque chose comme:

.... 
    dbo.MapDate(t2.CreatedOn) 
.... 
+0

pouvez-vous ajouter un lien pour utiliser [Function] i linq to sql datacontext – Nesizer

+0

Au niveau le plus simple, faites simplement glisser la fonction UDF sur le concepteur. Pour faire manuellement, voir ici pour un exemple trivial: http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/636a151186564c60/f10d7ef0c325caf3 –

3

Linq à -Sql ne peut pas traduire des fonctions .net arbitraires en S QL. Certaines fonctions DateTime peuvent être traduites cependant, et une liste complète est disponible ici: -

http://msdn.microsoft.com/en-us/library/bb882657.aspx

Dans votre exemple, si vous calculez le décalage de temps en dehors de la projection, vous pouvez ajouter le décalage à récupérer « CreatedOn » DateTime utilisant la méthode AddMinutes qui a une traduction prise en charge dans SQL.

+0

pour ce faire, j'ai besoin de connaître l'heure Je choisis la base de données parce que ce n'est pas toujours gmt + 1 en été c'est gmt + 2 – Nesizer

+0

Hum ouais, c'est vrai (!). J'ai le sentiment qu'il y a un moyen de contourner cela, laissez-moi réfléchir ... –

Questions connexes