Commerce serer 2007 exposes different API for different purpose but the main disadvantage is that it doesn’t give flexibility to develop ecommerce applications for multiple devices (channels – mobiles, kiosk, etc). To overcome this problem Microsoft has wrapped a new API model (multi-channel foundation) on top on existing commerce server runtime API. It exposes a set of models, known as commerce entities (such as products and baskets – similar to .NET entities) to represent the conceptual view of e-commerce. To know more about this, you can refer to following urls.

http://microsoftblog.co.in/commerceserver/how-i-learnt-commerce-server-foundation/

http://msdn.microsoft.com/en-us/library/dd327929.aspx

In this post, I am trying to fetch products under a category using commerce server foundation. The method takes three parameters – catalog name, category name and user id and returns all products in the form of datatable.

public  DataTable GetChildProducts(string CatalogName, string parentCategory, string userId)
{
CommerceRequestContext requestContext = new CommerceRequestContext();
requestContext.Channel = "Default";
requestContext.UserId = userId;
requestContext.RequestId = Guid.NewGuid().ToString();
requestContext.UserLocale = "en-US";
requestContext.UserUILocale = "en-US";

// Create a Operation Service Agent
OperationServiceAgent operationService = new OperationServiceAgent();

// Define DataTable
DataTabl productsDataTable =new DataTable();

// Query for a Product
CommerceQuery<CommerceEntity> queryBuilder = new CommerceQuery<CommerceEntity>("Category");
queryBuilder.SearchCriteria.Model.Id = parentCategory;
queryBuilder.Model.Properties.Add("Id");
queryBuilder.Model.Properties.Add("DisplayName");
queryBuilder.Model.Properties.Add("ListPrice");
queryBuilder.Model.Properties.Add("Description");

// Add more properties here….
queryBuilder.SearchCriteria.Model.Properties["CatalogId"] = CatalogName;

// Add Related Query Operation for Canonical Categories
{
CommerceQueryRelatedItem<CommerceEntity> childProduct = new CommerceQueryRelatedItem<CommerceEntity>("ChildProducts", "Product");
childProduct.Model.Properties.Add("Id");
childProduct.Model.Properties.Add("DisplayName");
childProduct.Model.Properties.Add("ListPrice");
childProduct.Model.Properties.Add("Description");
queryBuilder.RelatedOperations.Add(childProduct);
}

CommerceResponse response = operationService.ProcessRequest(requestContext , queryBuilder.ToRequest());

// Handle Responses
CommerceQueryOperationResponse queryBuilderResponse = (CommerceQueryOperationResponse)response.OperationResponses[0];
productsDataTable.Rows.Clear();
if (queryBuilderResponse.CommerceEntities.Count > 0)
{
CommerceEntity category = queryBuilderResponse.CommerceEntities[0];
//Iterate over Child products
if (category.GetPropertyValue("ChildProducts") != null)
{
foreach (CommerceRelationship childProduct in (CommerceRelationshipList)category.GetPropertyValue("ChildProducts"))
{      
            CommerceEntity product = childProduct.Target;
             DataRow newProductRow = productsDataTable.NewRow();
             newProductRow["id"] = product.Id;
             newProductRow["DisplayName"] = product.GetPropertyValue("DisplayName");
             newProductRow["Description"] = product.GetPropertyValue("Description");
             newProductRow["Price"] = product.GetPropertyValue("ListPrice");
             productsDataTable.Rows.Add(newProductRow);
}
}
}
return productsDataTable;
}

Related Articles


If you like this post, please click on our sponsor advertisement.


Leave a Reply

Follow me on Google+
Couldn't get data from google+
Sign up for Newsletter