2014-09-22 60 views
0

我在C#中有一个EntityCollection ec已填充所有帐户。 现在我想要ec中的另一个List或EntityCollection,它的所有帐户都处于活动状态。MSCRM 2011 EntitCollection和LINQ空结果集

我使用相同的Linq。

但LINQ的两种形式返回一个空的结果,而EC拥有354多项纪录

var activeCRMEC = (from cl in ec.Entities 
       where cl.Attributes["statecode"].ToString()=="0" 
       select cl); 

OR

var activeCRMEC = ec.Entities.Where(x => x.Attributes["statecode"].ToString() == "0"); 

每次结果集是空的,我无法遍历超过它。 300个左右的帐户是活跃的,我已检查。 同样的事情发生时,我使用一些其他属性,如名称等

请友善指出我的错误。

回答

0

您可以生成早期绑定类来编写Linq查询。

或Else

你可以写LINQ查询使用后期绑定使用OrganizationServiceContext类

,供大家参考:

OrganizationServiceContext OrgServiceCOntext = new OrganizationServiceContext(service); 

var RetrieveAll = OrgServiceCOntext.CreateQuery("account"). 
       ToList().Where(w => (w.GetAttributeValue<OptionSetValue>("statecode").Value ==0)).Select(s=>s); 
0

我会给你一些提示,然后告诉你我猜你的问题是什么。

首先,使用早期绑定的实体。如果您以前从未生成过这些文件,请使用earlybound generator,这样您可以节省很多麻烦。

其次,如果您不能使用早期绑定的实体,请在Entity类上使用GetAttribute()方法。它会为你转换类型,并处理空引用问题。

你的LINQ表达式看起来是正确的,所以ec.Entities中没有任何符合“状态码”等于0的条件的实体,或者你的IEnumerables上可能有一些不同的执行。尝试在LINQ语句后立即在activeCRMEC上调用ToList(),以确保这不是您的问题。

0

的statecode是OptionSetValue,你应该将其丢在这样

((OptionSetValue)cl.Attributes["statecode"]).Value == 0 

cl.GetAttributeValue<OptionSetValue>("statecode").Value == 0 

这两种方法都是有效的,你应该问的价值,它是一个int。

希望这可以帮助你。