ElementAt()在Linq到亚音速模式下不工作

ElementAt()在Linq到亚音速模式下不工作,linq,subsonic3,Linq,Subsonic3,我有一个疑问: var iterator = criteria.binaryAssetBranchNodeIds.GetEnumerator(); iterator.MoveNext(); var binaryAssetStructures = from bas in db.BinaryAssetStructures where bas.BinaryAssetStructureId == iterator.Current

我有一个疑问:

var iterator = criteria.binaryAssetBranchNodeIds.GetEnumerator();
iterator.MoveNext();
var binaryAssetStructures = from bas in db.BinaryAssetStructures
                              where bas.BinaryAssetStructureId == iterator.Current
                              select bas;
当我使用foreach循环迭代BinarySassetStructureID时,不会出现任何问题。当我尝试这个的时候

var binaryAssetStructure = binaryAssetStructures.ElementAt(0);
我发现以下错误:

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


首先,举个例子,它确实有效。。。我在这里遗漏了什么…

我根本不知道亚音速,但FWIW实体框架也存在类似的问题。在这种情况下,它归结为这样一个事实:ElementAt没有直接转换成SQL

第一个可以很容易地翻译为选择前1名从。。。ORDER BY…,但对于ElementAt来说,这一点并不容易表达

你可以说,例如ElementAt5应该翻译成从…中选择前5名。。。订购人。。。然后前四个元素被简单地丢弃了,但是如果你要求元素为100000,那就不太好用了

在EF中,您可以部分克服这个问题,强制首先计算表达式,这可以通过调用AsEnumerable、ToList或ToArray来完成

比如说

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

我希望这能有所帮助,尽管不是针对亚音速。

试试BinarySassetStructures.ToList.ElementAt0谢谢