Для начала нотация _productid_value
- это способ доступа WebAPI к полю поиска.Чтобы получить доступ к productid
, используя парадигму позднего связывания SDK, используйте:
myEntity["productid"]
или
myEntity.GetAttributeValue<Guid>("productid")
или
myEntity.GetAttributeValue<EntityReference>("productid")
.
Помимо этого, поскольку Product является поиском в OrderDetail, используя пару LinkEntity объектов, которые вы можете обойтись одним запросом.
Я бы, вероятно, использовал LINQ и сделал бы что-то подобное:
private void getProducts(Guid salesOrderId)
{
using (var context = new Microsoft.Xrm.Sdk.Client.OrganizationServiceContext(svc))
{
var query = from od in context.CreateQuery("salesorderdetail")
join so in context.CreateQuery("salesorder")
on od.GetAttributeValue<Guid>("salesorderid") equals so.GetAttributeValue<Guid>("salesorderid")
join p in context.CreateQuery("product")
on od.GetAttributeValue<Guid>("productid") equals p.GetAttributeValue<Guid>("productid")
where od.GetAttributeValue<Guid>("salesorderid").Equals(salesOrderId)
select new
{
OrderDetailId = od.GetAttributeValue<Guid>("salesorderdetailid"),
ProductId = od.GetAttributeValue<EntityReference>("productid"),
Quantity = od.GetAttributeValue<decimal?>("quantity"),
IsPriceLocked = so.GetAttributeValue<bool?>("ispricelocked"),
PricePerUnit = od.GetAttributeValue<Money>("priceperunit"),
ProductTypeCode = od.GetAttributeValue<OptionSetValue>("producttypecode"),
ProductStructure = p.GetAttributeValue<OptionSetValue>("productstructure"),
ProductNumber = p.GetAttributeValue<string>("productnumber")
};
var results = query.ToList();
var products = results.Where(e => e.ProductStructure.Value == 6).ToList();
var bundles = results.Where(e => e.ProductStructure.Value == 3).ToList();
}
}
Обратите внимание, что локальные переменные results
, products
и bundles
являются анонимным типом.Вы можете просмотреть и получить доступ к свойствам каждого объекта, но есть также большой шанс, что вы захотите привести их к экземплярам реального класса.