3

我正在编写如下Linq查询:但是在运行时抛出以下错误:

The method 'Join' cannot follow the method 'SelectMany' or is not supported. Try writing the query in terms of supported methods or call the 'AsEnumerable' or 'ToList' method before calling unsupported methods.

LINQ

from a in AccountSet
join sm in new_schoolMemberSet on a.AccountId equals sm.new_OrganisationId.Id 
        into ps from suboc in ps.DefaultIfEmpty()
join sr in new_schoolRoleSet on suboc.new_SchoolRoleId.Id equals sr.new_schoolRoleId
where sr.new_name == "Manager"
where a.new_OrganisationType.Value == 430870007
select new { a.AccountId, suboc.new_schoolMemberName }

我期待结果如下:

在此处输入图像描述

我以前从未在 Linq 中使用过外部联接。因此,如果我做错了,请纠正我。

谢谢

4

1 回答 1

1

错误似乎很明显。问题不在于 Linq,而在于提供者无法将您的查询翻译成它可以在其末端执行的东西。要检验这个理论,您可以简单地在、和.ToList()的末尾添加。这不是您想要运行查询的方式,但它将作为查询是否有错误或提供者的证明(基于错误,它是提供者,但这仍然会证明查询是否正确形成)。AccountSetnew_schoolMemberSetnew_schoolRoleSet

添加ToList()到这些集合中的每一个都会将所有数据带入内存,并且将使用 linq-to-objects 而不是 linq-to-whateverYourLinqProviderIs。一些 linq 提供程序根本无法处理更复杂的查询。您可以想象将 linq 查询转换为提供者可以理解的查询格式是多么困难。此外,一些 linq 查询概念并不能转化为特定提供者可能的东西。

那么解决方法是什么?您想利用 linq 提供程序的能力来有效地查询数据,但它的功能可能会受到限制。尝试通过使用支持的过滤等将尽可能少的数据带入内存然后使用 linq-to-objects 完成其余的工作。

于 2013-10-23T16:52:15.943 回答