ElementAt() 在 Linq to SubSonic 中不起作用

发布于 2024-08-17 04:56:29 字数 685 浏览 4 评论 0原文

我有这个查询:

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);

出现以下错误:

Unable to cast object of type 'System.Linq.Expressions.MethodCallExpression' to type 'SubSonic.Linq.Structure.ProjectionExpression'

First() for example does work...我在这里缺少什么...

I have this query:

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

When I iterate over the binaryAssetStructureIds with a foreach loop no problems occur. When I try this

var binaryAssetStructure = binaryAssetStructures.ElementAt(0);

I get following error:

Unable to cast object of type 'System.Linq.Expressions.MethodCallExpression' to type 'SubSonic.Linq.Structure.ProjectionExpression'

First() for example does work... What am I missing here...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

楠木可依 2024-08-24 04:56:29

我根本不知道 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。

I don't know SubSonic at all, but FWIW a similar issue exists with the Entity Framework. In that case it boils down to the fact that there's no direct translation of ElementAt to SQL.

First() can be easily translated to SELECT TOP 1 FROM ... ORDER BY ..., but the same is not easily expressed for ElementAt.

You could argue that e.g. ElementAt(5) should be translated to SELECT TOP 5 FROM ... ORDER BY ... and then the first four elements simply discarded, but that doesn't work very well if you ask for ElementAt(100000).

In EF, you can partialle overcome this issue forcing the expression to be evaluated first, which can be done with calls to AsEnumerable, ToList or ToArray.

For example

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

I hope this helps although not explicitly directed at SubSonic.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文