ElementAt()在Linq中不能用于SubSonic

时间:2010-01-05 13:20:39

标签: linq subsonic3

我有这个问题:

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

当我使用foreach循环遍历binaryAssetStructureIds时,不会出现问题。我试试这个时

var binaryAssetStructure = binaryAssetStructures.ElementAt(0);

我收到以下错误:

无法将“System.Linq.Expressions.MethodCallExpression”类型的对象强制转换为“SubSonic.Linq.Structure.ProjectionExpression”

First()例如确实有效......我在这里缺少什么......

1 个答案:

答案 0 :(得分:2)

我根本不了解SubSonic,但FWIW与实体框架存在类似的问题。在这种情况下,它归结为没有将ElementAt直接转换为SQL的事实。

First()可以很容易地翻译为SELECT TOP 1 FROM ... ORDER BY ...,但ElementAt不容易表达同样的内容。

你可以争辩说,例如ElementAt(5)应转换为SELECT TOP 5 FROM ... ORDER BY ...,然后将前四个元素简单地丢弃,但如果您要求ElementAt(100000),则效果不佳。

在EF中,您可以帮助克服此问题,强制首先评估表达式,这可以通过调用AsEnumerableToListToArray来完成。

例如

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

我希望这有帮助,尽管没有明确针对SubSonic。