ElementAt () не работает в Linq to SubSonic

У меня такой запрос:

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 () работает ... Что мне здесь не хватает ...


person Lieven Cardoen    schedule 05.01.2010    source источник
comment
попробуйте binaryAssetStructures.ToList (). ElementAt (0) Спасибо   -  person Mahesh Velaga    schedule 05.01.2010


Ответы (1)


Я вообще не знаю 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.

person Mark Seemann    schedule 05.01.2010