我有这个问题:
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()例如确实有效......我在这里缺少什么......
答案 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中,您可以帮助克服此问题,强制首先评估表达式,这可以通过调用AsEnumerable
,ToList
或ToArray
来完成。
例如
var binaryAssetStructure = binaryAssetStructures.AsEnumerable().ElementAt(0);
我希望这有帮助,尽管没有明确针对SubSonic。