2010-01-05 3 views
1

J'ai cette requête:ElementAt() ne fonctionne pas dans Linq à SubSonic

var iterator = criteria.binaryAssetBranchNodeIds.GetEnumerator(); 
iterator.MoveNext(); 
var binaryAssetStructures = from bas in db.BinaryAssetStructures 
           where bas.BinaryAssetStructureId == iterator.Current 
           select bas; 

Quand j'itérer sur les binaryAssetStructureIds avec une boucle foreach pas de problème. Lorsque je tente cette

var binaryAssetStructure = binaryAssetStructures.ElementAt(0); 

J'obtiens l'erreur suivante:

Impossible de jeter l'objet de type 'System.Linq.Expressions.MethodCallExpression' taper 'SubSonic.Linq.Structure.ProjectionExpression'

First() par exemple fonctionne ... Qu'est-ce que je manque ici ...

+1

essayez binaryAssetStructures.ToList(). ElementAt (0) merci –

Répondre

2

Je ne connais pas du tout SubSonic, mais FWIW un problème similaire existe avec Entity Framework. Dans ce cas, cela se résume au fait qu'il n'y a pas de traduction directe d'ElementAt en SQL.

First() peut être facilement traduit en SELECT TOP 1 FROM ... ORDER BY ..., mais la même chose n'est pas facilement exprimée pour ElementAt.

Vous pourriez soutenir que, par exemple, ElementAt(5) devrait être traduit en SELECT TOP 5 FROM ... ORDER BY ... et ensuite les quatre premiers éléments simplement éliminés, mais cela ne fonctionne pas très bien si vous demandez ElementAt(100000).

Dans EF, vous pouvez partiellement résoudre ce problème en forçant l'évaluation de l'expression en premier, ce qui peut être fait avec des appels à AsEnumerable, ToList ou ToArray.

Par exemple

var binaryAssetStructure = binaryAssetStructures.AsEnumerable().ElementAt(0); 

J'espère que cette aide mais pas explicitement dirigé à subsonique.

Questions connexes