ElementAt () не работает в Linq to SubSonic - PullRequest
1 голос
/ 05 января 2010

У меня есть этот запрос:

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

Когда я перебираю binaryAssetStructureIds с циклом foreach, никаких проблем не возникает. Когда я пытаюсь это

var binaryAssetStructure = binaryAssetStructures.ElementAt(0);

Я получаю следующую ошибку:

Невозможно привести объект типа 'System.Linq.Expressions.MethodCallExpression' к типу SubSonic.Linq.Structure.ProjectionExpression '

First (), например, работает ... Что мне здесь не хватает ...

1 Ответ

2 голосов
/ 05 января 2010

Я не знаю SubSonic вообще, но FWIW похожая проблема существует с Entity Framework. В этом случае все сводится к тому, что нет прямого перевода ElementAt в SQL.

First() можно легко перевести на SELECT TOP 1 FROM ... ORDER BY ..., но то же самое нелегко выразить для ElementAt.

Вы можете утверждать, что, например, ElementAt(5) следует перевести на SELECT TOP 5 FROM ... ORDER BY ..., а затем просто отбросить первые четыре элемента, но это не очень хорошо работает, если вы попросите ElementAt(100000).

В EF вы можете частично решить эту проблему, заставив выражение сначала вычисляться, что можно сделать с помощью вызовов AsEnumerable, ToList или ToArray.

Например

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

Надеюсь, это поможет, хотя и не направлено явно на SubSonic.

...