4

我正在使用 LINQ 从 Microsoft Dynamics CRM Online 中检索帐户类型实体。我无法过滤特定格式值的列表。我有正确的值,但收到的记录为零。我正在创建这样的连接:

var connection = new CrmConnection("CRMOnline");
connection.ProxyTypesEnabled = true;
CrmOrganizationServiceContext _context = new CrmOrganizationServiceContext(connection);

我试过了:

List<Account> items = _context.CreateQuery<Account>()
                              .Where( c => ((OptionSetValue)c["new_accreditationstatus"]).Equals(7))
                              .ToList();

List<Account> items = _context.CreateQuery<Account>()
                              .Where( c => c.GetFormattedAttributeValue("new_accreditationstatus") == "7"
                              .ToList();

List<Account> items = _context.CreateQuery<Account>()
                              .Where( c => c["new_accreditationstatus"] == "7"
                              .ToList();

最后一个抛出 System.Format 异常。

过滤正常属性,即.Where(c => c.AccountNumber.StartsWith("2010"))工作得很好。

4

4 回答 4

4

您只能_____Set在生成早期绑定 CRM 文件(查看crmsvcutil.exe/Xrm.cs在线)并创建早期绑定派生CrmOrganizationServiceContext(通常称为XrmServiceContext)时才能访问实体。您可以在早期绑定文件中看到可用的构造函数。

因此,如果您OptionSetValue事先知道 (int) 的值(在本例中为 7),则可以将此值用作Where子句中的参数之一,正如您在其他地方所述:

.Where( c => c.new_AccreditationStatus.Value == 7)
于 2012-07-11T21:21:26.620 回答
1

编辑(试试这个):

var list = _context.AccountSet.Where(c => 
                     c.FormattedValues["new_accreditationstatus"] == "7").ToList();
于 2012-07-11T16:15:28.973 回答
1

另一个很好的问题,但不幸的是,我认为这将代表Linq provider 的另一个失败/“限制”,它没有提到任何关于FormattedValuesWhere子句允许使用的内容,尽管它被允许作为该Select子句中的一个项目.

s的实际值OptionSetValue存储在StringMap实体中,顺便说一句,您可以StringMap通过 Linq访问实体。一个例子如下。

// This query gets one permissible value for this entity and field.
var actualValue = _context.CreateQuery("stringmap")
    .Where(x => x.GetAttributeValue<string>("attributename") == "new_accreditationstatus")
    .Where(x => x.GetAttributeValue<int>("value") == "7")
    .Where(x => x.GetAttributeValue<int>("objecttypecode") == Account.EntityTypeCode)
    .Select(x => x.GetAttributeValue<string>("value"))
    .Single();

但是,尝试使用子查询和原始查询的版本在此基础上进行构建,如下所示,会导致异常,如下所示。

var actualValues = _context.CreateQuery("stringmap")
    .Where(x => x.GetAttributeValue<string>("attributename") == "new_accreditationstatus")
    .Where(x => x.GetAttributeValue<int>("objecttypecode") == Xrm.Account.EntityTypeCode);

// This (modified) query uses the StringMap values from the previous query in
// a subquery, linking to the int (attributevalue) value that
// new_accreditationstatus represents.
List<Account> items = _context.CreateQuery<Account>()
    .Where(c => actualValues
        .Where(x => x.GetAttributeValue<int>("attributevalue") == c.new_accreditationstatus.Value)
        .Select(x => x.GetAttributeValue<string>("attributevalue"))
        .Single() == "7")
    .ToList();

...引发异常。

实体“StringMap”上未定义权限类型读取。

这当然令人沮丧,因为不知何故,Linq 允许您在第一个查询中查询字符串映射。

因此,您必须首先查询对应于“7”的StringMap实体,然后在引用该值的查询中使用该值,如下所示:AttributeValue

var actualValue = _context.CreateQuery("stringmap")
    .Where(x => x.GetAttributeValue<string>("attributename") == "new_accreditationstatus")
    .Where(x => x.GetAttributeValue<int>("value") == "7")
    .Where(x => x.GetAttributeValue<int>("objecttypecode") == Account.EntityTypeCode)
    .Select(x => x.GetAttributeValue<string>("attributevalue"))
    .Single();

List<Account> items = _context.CreateQuery<Account>()
    .Where(c => c.new_accreditationstatus = new OptionSetValue(actualValue)
    .ToList();

如果我能在一个查询中找到一种方法来完成所有这些,我一定会编辑并重新发布。

于 2012-07-11T20:26:04.343 回答
0

你见过会为选项集生成枚举的 crmsvcutil 扩展吗?

于 2012-07-13T19:07:13.590 回答