繁体   English   中英

LINQ错误使用DefaultIfEmpty时

[英]LINQ Error When using DefaultIfEmpty

我试图拉下联系人的NULLS,我正在使用DefaultIfEmpty来做。 但是我收到了这个错误。

“方法'GroupJoin'不能遵循方法'Join'或不支持。尝试根据支持的方法编写查询,或者在调用不支持的方法之前调用'AsEnumerable'或'ToList'方法。”

我正在使用LINQ-to-CRM提供程序并从CRM 2011 Web Service查询。

这是我正在使用的代码:

var linqQuery = (from r in orgServiceContext.CreateQuery("opportunity")
         join a in orgServiceContext.CreateQuery("account") on ((EntityReference)r["accountid"]).Id equals a["accountid"]
         join c in orgServiceContext.CreateQuery("contact") on ((EntityReference)r["new_contact"]).Id equals c["contactid"]
         where ((EntityReference)r["new_channelpartner"]).Id.Equals(new Guid("c55c2e09-a3be-e011-8b2e-00505691002b"))
         select new
         {
           OpportunityId = !r.Contains("opportunityid") ? string.Empty : r["opportunityid"],
           CustomerId = !r.Contains("customerid") ? string.Empty : ((EntityReference)r["customerid"]).Name,
           Priority = !r.Contains("opportunityratingcode") ? string.Empty : r.FormattedValues["opportunityratingcode"],
           ContactName = !r.Contains("new_contact") ? string.Empty : ((EntityReference)r["new_contact"]).Name,
           Source = !r.Contains("new_source") ? string.Empty : r["new_source"],
           CreatedOn = !r.Contains("createdon") ? string.Empty : r["createdon"],
           State = !a.Contains("address1_stateorprovince") ? string.Empty : a["address1_stateorprovince"],
           Zip = !a.Contains("address1_postalcode") ? string.Empty : a["address1_postalcode"],
           Eval = !r.Contains("new_colderevaluation") ? string.Empty : r.FormattedValues["new_colderevaluation"],
           DistributorName = !r.Contains("new_channelpartner") ? string.Empty : ((EntityReference)r["new_channelpartner"]).Name,
           ContactStreetAddress = !c.Contains("address1_line1") ? string.Empty : c["address1_line1"]
         });

我该怎么做才能摆脱这个错误? 任何帮助都是极好的。

谢谢!

由于您的LINQ查询必须最终转换为有效的QueryExpression,因此您无法执行一些更高级的投影内容,因为OrganizationDataContext不够智能,无法运行简单的QueryExpression,然后应用您的乐趣“ fieldname = !c.Contains("fieldname") ? string.Empty : c["fieldname"] ”在内存中。 你必须自己做。

所以,在你的第一个查询中,只需:

var linqQuery = (from r in orgServiceContext.CreateQuery("opportunity")     
    // snip
    select new
    {
      fieldname = c["fieldname"],
      //etc...
    });

然后做一些事情:

var linqQuery2 = from r in linqQuery.ToList()
                 select new
                 {
                   fieldname = r["fieldname"] == null ? string.Empty : r["fieldname"],
                   //(etc)...
                 };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM