I need assistance with debugging this plugin. Basic plugin logic: If the order product's product has field "ktl_ConsolidateintoServices.Value" == true, combine these order products into one specific product called "Professional Services". Also create an order service for each of these order products that were combined. When debugging in Plugin Registration Tool, here is what I have.
Error Message - Detail from Plugin Registration Tool
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Sequence contains no elements
Detail: <OrganizationServiceFault xmlns="schemas.microsoft.com/.../Contracts" xmlns:i="www.w3.org/.../XMLSchema-instance">
<ErrorCode>-2147220970</ErrorCode>
<ErrorDetails xmlns:a="schemas.datacontract.org/.../System.Collections.Generic">
<KeyValuePairOfstringanyType>
<a:key>CallStack</a:key>
<a:value i:type="b:string" xmlns:b="www.w3.org/.../XMLSchema"> at Microsoft.Xrm.Sdk.Linq.QueryProvider.ThrowException(Exception exception)
at Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute(QueryExpression qe, Boolean throwIfSequenceIsEmpty, Boolean throwIfSequenceNotSingle, Projection projection, NavigationSource source, List`1 linkLookups, String& pagingCookie, Boolean& moreRecords)
at Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](QueryExpression qe, Boolean throwIfSequenceIsEmpty, Boolean throwIfSequenceNotSingle, Projection projection, NavigationSource source, List`1 linkLookups)
at Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](Expression expression)
at Microsoft.Xrm.Sdk.Linq.QueryProvider.System.Linq.IQueryProvider.Execute[TResult](Expression expression)
at System.Linq.Queryable.First[TSource](IQueryable`1 source, Expression`1 predicate)
at EPSalesOrderSetStatePlugin2.SalesOrderSetStatePlugin.Execute(IServiceProvider serviceProvider)
at PluginProfiler.Library.PluginAppDomainProxy.ExecuteCore(Stopwatch watch, ProfilerExecutionReport report, Object instance, Object executionParameter)
at PluginProfiler.Library.AppDomainProxy.Execute(ProfilerExecutionConfiguration configuration, ProfilerExecutionReport report)</a:value>
</KeyValuePairOfstringanyType>
</ErrorDetails>
<Message>Sequence contains no elements</Message>
<Timestamp>2018-03-20T16:49:18.8750277Z</Timestamp>
<InnerFault i:nil="true" />
<TraceText i:nil="true" />
</OrganizationServiceFault>
Copy of Code
public void Execute(IServiceProvider serviceProvider)
{
ITracingService val = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
IPluginExecutionContext val2 = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
this.ValidateContext(val2, val);
EntityReference salesOrderReference = (EntityReference)val2.InputParameters["EntityMoniker"];
if (((OptionSetValue)(val2.InputParameters["State"])).Value == 1)
{
CrmServiceContext crmService = new CrmServiceContext(((IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory))).CreateOrganizationService(new Guid?(val2.UserId)));
IQueryable<SalesOrderDetail> salesOrderDetailSet = crmService.SalesOrderDetailSet;
IQueryable<Product> productSet = crmService.ProductSet;
var list = (from x in crmService.SalesOrderDetailSet.Join(
crmService.ProductSet,
(SalesOrderDetail x) => x.ProductId.Id,
(Product x) => x.Id,
(SalesOrderDetail x, Product y) => new
{
x,
y
})
where x.x.SalesOrderId.Id == salesOrderReference.Id && x.y.ktl_ConsolidateintoServices.Value == true
select x).ToList();
SalesOrder salesOrder = crmService.SalesOrderSet.First((SalesOrder x) => x.Id == salesOrderReference.Id);
if (list.Any())
{
decimal num = default(decimal);
foreach (var item in list)
{
num += item.x.BaseAmount.Value;
if (!crmService.IsAttached(item.x))
{
crmService.Attach(item.x);
}
// crmService.DeleteObject(item.x);
ktl_OrderService ktl_OrderService = new ktl_OrderService
{
ktl_ServiceProductNumber = item.y.ProductNumber,
ktl_ProductId = item.x.ProductId,
ktl_UoMId = item.x.UoMId,
ktl_PricePerUnit = item.x.PricePerUnit,
ktl_Quantity = item.x.Quantity,
};
crmService.AddObject(ktl_OrderService);
}
Product product = crmService.ProductSet.First((Product x) => x.Id == this._serviceProductId);
SalesOrderDetail salesOrderDetail = new SalesOrderDetail
{
IsPriceOverridden = true,
ProductId = product.ToEntityReference(),
Quantity = 1,
PricePerUnit = new Money(num),
SalesOrderId = salesOrder.ToEntityReference(),
UoMId = product.DefaultUoMId
};
crmService.AddObject(salesOrderDetail);
try
{
crmService.SaveChanges();
}
catch (Exception ex)
{
val.Trace(ex.Source, new object[0]);
val.Trace(ex.ToString(), new object[0]);
throw new InvalidPluginExecutionException(ex.Message);
}
}
}
}