另一个很好的问题,但不幸的是,我认为这将代表Linq provider 的另一个失败/“限制”,它没有提到任何关于FormattedValues
该Where
子句允许使用的内容,尽管它被允许作为该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();
如果我能在一个查询中找到一种方法来完成所有这些,我一定会编辑并重新发布。