外连接在Linq查询中不起作用:方法'Join'不能遵循'SelectMany'方法或不支持

时间:2013-10-23 15:50:34

标签: c# linq linq-to-entities dynamics-crm-2011 linqpad

我正在编写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 }

我期待结果如下:

enter image description here

之前我从未在Linq中使用过外连接。如果我做错了,请纠正我。

由于

1 个答案:

答案 0 :(得分:1)

错误似乎很清楚。问题不在于Linq,而是提供商无法将您的查询转换为可在其末端执行的内容。要测试此理论,您只需将.ToList()添加到AccountSetnew_schoolMemberSetnew_schoolRoleSet的末尾即可。这不是你想要运行查询的方式,但它将作为查询是否有错的证明,或提供者(基于错误,它是提供者,但这仍将证明查询是否正确形成。)

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

那么修复是什么?您希望利用linq提供程序的能力来有效地查询数据,但它可能会受到限制。尝试使用 支持的过滤等将尽可能少的数据存入内存,然后使用linq-to-objects完成剩下的工作。