2010-11-15 7 views
0

Je vais avoir un peu de problème de conversion l'instruction T-SQL suivante à LINQ (en utilisant le framework 4.0 de l'entité)T-Sql aux problèmes de conversion LINQ (ordre par)

Je reçois

Impossible de convertir le type 'System.Linq.IOrderedQueryable 1' to type 'System.Linq.IQueryable 1'. LINQ aux entités prend uniquement en charge la coulée Types de primitive Entity Data Model.

T-Sql

SELECT 
    I.Id 
    , I.Name 
FROM Inventory I 
WHERE I.Id in 
    (
    select top 5 applicationId 
    from LastViewed 
    group by ApplicationId, SomeUserId 
    having SomeUserId = @SomeUserId 
    order by Max(id) desc 
    ) 

C'est ce que j'ai en ce moment (avec l'aide de Linqer)

Dim query As IQueryable(Of Inventory) = 
     From d In ctx.Inventories 
     Where 
      ((From e In ctx.LastVieweds _ 
      Group e By _ 
       e.ApplicationId, _ 
       e.SomeUserId _ 
      Into g = Group _ 
      Where DfaitEdsId = user _ 
      Order By g.Max(Function(p) p.Id) Descending _ 
      Select New With { _ 
       ApplicationId _ 
      }).Take(5)).Contains(New With {.ApplicationId = d.Id}) _ 
     Select d 

il se bloque actuellement quand je fais cette ligne.

query.ToList() 

Merci pour votre temps.

+0

J'ai un problème similaire ici: http://stackoverflow.com/questions/4416887/ef4-linq-2-entities-query-works-in-c-but-not- in-vb. Je soupçonne que le compilateur VB.Net est à blâmer, puisque je pourrais le faire fonctionner en C#. Pourriez-vous donner un peu plus de contexte, afin que nous puissions essayer de repro votre problème (pls expliquent ce que 'DfaitEdsId' et' user' sont)? – jeroenh

Répondre

3

Votre 'problème' est dans votre toute première ligne. La requête que vous avez spécifiée renvoie un IOrderedQueryable(Of Inventory) que vous essayez d'affecter à une variable de type IQueryable(Of Inventory). Vous n'obtenez pas l'erreur jusqu'à query.ToList() grâce à l'exécution différée. Vous pouvez laisser le compilateur déduire le type si vous avez « l'option déduisent » activée sur votre projet et votre requête serait quelque chose comme:

Dim query = 
     From d In ctx.Inventories 
     Where 
      (From e In ctx.LastVieweds _ 
      Group e By _ 
       e.ApplicationId, _ 
       e.SomeUserId _ 
      Into g = Group _ 
      Where DfaitEdsId = user _ 
      Order By g.Max(Function(p) p.Id) Descending _ 
      Select ApplicationId Take 5 _ 
      ).Contains(d.Id) _ 
     Select d 

Ou vous pouvez simplement changer le type de query être IOrderedQueryable(Of Inventory)

Note: Ce que vous avez fonctionne très bien dans Linq to SQL, mais Entities est beaucoup plus stricte quand il s'agit de casting.

Editer: Très bien, essayons d'y aller un peu plus en profondeur. Dites-moi quelle ligne explose ce qui suit:

Dim innerList = (From e In ctx.LastVieweds _ 
       Group e By _ 
       e.ApplicationId, _ 
       e.SomeUserId _ 
       Into g = Group _ 
       Where DfaitEdsId = user _ 
       Order By g.Max(Function(p) p.Id) Descending _ 
       Select ApplicationId Take 5).ToList() 
Dim query = (From d In ctx.Inventories 
      Where innerList.Contains(d.Id) _ 
      Select d).ToList() 

N'oubliez pas de réduire les résultats vers le bas un peu si les requêtes avec énumération « ToList() » est trop. Les types des deux variables sont maintenant List(Of Inventory)

+0

merci pour le conseil. J'avais essayé cela et j'ai eu l'erreur suivante. Impossible de convertir le type 'System.Linq.IOrderedQueryable'1' en type 'System.Linq.IQueryable'1'. LINQ to Entities ne prend en charge que les types de primitive Entity Data Model. Une idée? – Lareau

+0

La requête que vous avez listée est-elle le seul endroit où vous affectez une valeur à interroger? – diceguyd30

+0

@ diceGuyd30 oui à votre commentaire précédent. J'ai remarqué que j'ai posté le mauvais message d'erreur à votre réponse. J'obtiens une erreur de compilation - Option Strict On interdit les conversions implicites de System.Linq.Iqueryable (inventory) à System.Linq.IOrderedQueryable). Tout ce qui se trouve sous la requête Dim Query en tant que ligne IOrderedQueryable est souligné en tant que problème de compilation. – Lareau