MSCRM 2011 EntitCollection和LINQ空结果集

时间:2014-09-22 13:53:56

标签: linq dynamics-crm-2011 dynamics-crm

我在C#中有一个 EntityCollection ec ,其中已填充了所有帐户。 现在我需要来自 ec 的另一个List或EntityCollection,其中所有帐户的状态都处于活动状态。

我正在使用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个左右的帐户。 当我使用其他属性如name等时会发生同样的事情。

请善意指出我的错误。

3 个答案:

答案 0 :(得分:0)

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

首先,使用早期绑定实体。如果您之前从未生成过它们,请使用earlybound generator,这样可以让您自己避免烦恼。

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

您的LINQ表达式看起来是正确的,因此ec.Entities中没有任何符合" statecode"标准的实体。等于0,或者您的IEnumerables可能会发生一些不同的执行。在LINQ语句之后立即尝试在activeCRMEC上调用ToList(),以确保这不是您的问题。

答案 1 :(得分:0)

statecode是一个OptionSetValue,您应该以这种方式投射它

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

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

两种方式都有效,你应该要求它是一个int。

希望这可以帮到你。

答案 2 :(得分:0)

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

或其他

您可以使用后期绑定使用 OrganizationServiceContext类编写Linq查询。

供您参考:

 OrganizationServiceContext OrgServiceCOntext = new OrganizationServiceContext(service);

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