Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DefaultIfEmpty时出现LINQ错误_C#_Linq_Dynamics Crm_Crm_Dynamics Crm 2011 - Fatal编程技术网

C# 使用DefaultIfEmpty时出现LINQ错误

C# 使用DefaultIfEmpty时出现LINQ错误,c#,linq,dynamics-crm,crm,dynamics-crm-2011,C#,Linq,Dynamics Crm,Crm,Dynamics Crm 2011,我正在尝试下拉联系人的空值,并使用DefaultIfEmpty来执行此操作。但我得到了这个错误 “方法'GroupJoin'不能跟在方法'Join'后面,或者不受支持。请尝试使用受支持的方法编写查询,或者在调用不受支持的方法之前调用'AsEnumerable'或'ToList'方法。” 我正在使用LINQ to CRM提供程序,并从CRM 2011 Web服务进行查询 这是我正在使用的代码: var linqQuery = (from r in orgServiceContext.CreateQ

我正在尝试下拉联系人的空值,并使用DefaultIfEmpty来执行此操作。但我得到了这个错误

“方法'GroupJoin'不能跟在方法'Join'后面,或者不受支持。请尝试使用受支持的方法编写查询,或者在调用不受支持的方法之前调用'AsEnumerable'或'ToList'方法。”


我正在使用LINQ to CRM提供程序,并从CRM 2011 Web服务进行查询

这是我正在使用的代码:

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

您正在使用哪个LINQ提供商?我正在使用LINQ to CRM提供商并从CRM 2011 Web服务进行查询。谢谢!所以我需要做两个查询?我将如何提出这两个问题?对不起,我是LINQ的新手。谢谢你的帮助!我已经对它进行了更新,使其更加明显。在第一个linqQuery中,只需做一些可以转换为FetchXML的简单事情。然后在linqQuery2中,您将根据第一个linqQuery的结果进行查询。ToList()是一个秘密-它强制运行第一个查询(使用FetchXML和OrganizationServiceContext),然后第二个查询就在内存中发生。谢谢Josh,我尝试了一下,得到了以下错误:“CS1928:'AnonymousType#1'不包含'Contains'的定义,并且最佳扩展方法重载'System.Linq.Queryable.Contains(System.Linq.IQueryable,TSource)'具有一些无效参数。””“你知道吗?谢谢Ah-您正在使用的.Contains方法仅在处理实体类型对象时按预期工作。因为我们使用两个查询,所以第二个查询不是针对真实实体,而是针对匿名类型(因为您在第一个查询中使用了select new)。修复方法是在第二个查询中不使用.Contains,而只是使用普通代码检查null。谢谢Josh!如何在不使用Contains的情况下检查空值?有什么想法吗?谢谢