【发布时间】:2014-09-09 15:30:36
【问题描述】:
我在保存使用包含连接的 LINQ 查询从 CRM 获得的实体时遇到问题。
我在尝试更新 CRM 实体时遇到的内部异常是:
Message = "Message = "'x_productpurchase' 实体不包含 Name = 'l_0.statuscode' 的属性。"
查询:
var subscriptionsTemp = (from p in _serviceContext.x_productpurchaseSet
join l in _serviceContext.x_ProductInOrderSet on p.Id equals l.x_ProductsInOrder.Id
where p.x_contactId.Id == contactID
&& p.x_subscription_type != null
select new { subsciption = p, line = l }).ToList();
List<x_productpurchase> subscriptions = subscriptionsTemp
.Where(x => productTypesToLookFor == null || (x.line.x_productId != null && productTypesToLookFor.Contains(x.line.x_productId.Id)))
.Select(x => x.subsciption).Distinct().ToList<x_productpurchase>();
上述代码的目的是检索包含List<Guid> productTypesToLookFor中定义的特定产品的特定联系人的产品订单。
在我们返回一行后,我们更改检索到的实体的一些值,并尝试使用 _serviceContext.Update() // XrmServiceContext 将更改保存回 CRM。
这是抛出上述错误的时候。
我们得出的结论是该错误是由查询中的子表连接引起的,因为这似乎在返回的某些变量名称中引入了别名。这可以在检索到的实体的属性中看到(绿色圆圈):
有什么想法可以解决这个问题,以便我们可以立即保存和使用实体?
现在我们正在通过执行上述查询来解决问题,然后使用其 Guid 再次获取特定的产品订单,然后进行处理。这不是一个理想的情况,因为这迫使我们进行更多的数据库查询。
【问题讨论】:
-
we change a few values你是否更改了 statecode 或 statuscode 字段? -
不,我们只更改了一些我们自己添加的自定义字段。
-
如果你在显示的第一行设置一个断点,
_serviceContext.x_productpurchaseSet[0].Attributes是否已经包含那些给你带来问题的,即l_0AliasedValues? -
是的,他们已经在那里了。我相信这是第一条语句中的加入导致它们好像被删除了一样。
标签: c# linq lambda dynamics-crm-2011