Catalog
Overview
The catalog domain covers products, categories, brands and the search infrastructure.
Products and types
Products represent items or services and are stored in Product
. ProductType
defines variations like SimpleProduct
, GroupedProduct
, or Bundle
. Products may include media (ProductMediaFile
), tags (ProductTag
), and relationships such as CrossSellProduct
or RelatedProduct
.
Categories and brands
Categories form a tree via Category
and ProductCategory
and can be loaded with ICategoryService
. Manufacturers are modeled as Manufacturer
entities and assigned to products through ProductManufacturer
.
Attributes
Product attributes allow customers to configure variants. Use global attribute definitions and ProductAttributeValue
links to define options. Specification attributes describe filterable characteristics displayed on category pages.
Accessing catalog data
Products
Retrieve products directly via SmartDbContext.Products
using standard Entity Framework Core queries:
var product = await _db.Products
.AsNoTracking()
.FirstOrDefaultAsync(x => x.Sku == "SKU-1");
ProductQueryExtensions
adds helper methods to shape the query. Use ApplyStandardFilter
to exclude unpublished or system products and stack other filters as needed:
var products = await _db.Products
.ApplyStandardFilter()
.ApplySkuFilter("SKU-1")
.ToListAsync();
Other useful filters include:
ApplyGtinFilter
/ApplyMpnFilter
– search by GTIN or MPN.ApplyProductCodeFilter
– look up a product by SKU, GTIN, or MPN in one call.ApplyAssociatedProductsFilter
– retrieve child products of grouped items.ApplyDescendantsFilter
– traverse a category tree path.ApplySystemNameFilter
– match a product's system name.
Categories
Categories benefit from ICategoryService
, which caches the entire tree and provides helper methods.
GetCategoryTreeAsync
returns a TreeNode<ICategoryNode>
rooted at a virtual root. Each node exposes its children and Depth
, making it easy to traverse or render hierarchical menus:
var tree = await _categoryService.GetCategoryTreeAsync();
// dump the tree with indentation
foreach (var node in tree.FlattenNodes(false))
{
Console.WriteLine(new string(' ', node.Depth * 2) + node.Value.Name);
}
To build a breadcrumb for a specific category, load the entity and call GetCategoryPathAsync
. The method returns a string containing all ancestors, separated by " » ":
var category = await _db.Categories.FindAsync(categoryId);
var path = await _categoryService.GetCategoryPathAsync(category);
// path => "Root » Subcategory » Current"
This combination of tree and path helpers enables quick menu rendering and breadcrumb generation without repeated database queries.
Searching
ICatalogSearchService
builds search queries and executes them against either the database or an index provider. Category and manufacturer pages reuse this service to fetch product lists with paging, filtering and sorting applied:
var query = new CatalogSearchQuery();
query.DefaultTerm = "shirt";
query.Slice(0, 10); // page size 10
var result = await _catalogSearchService.SearchAsync(query);
CatalogSearchQuery
inherits from SearchQuery<T>
and exposes a wide range of properties to shape the request:
DefaultTerm
– search phrase.ParseSearchTerm
– parse the term for advanced filter syntax.LanguageId
/LanguageCulture
/CurrencyCode
– context for localized fields and prices.StoreId
– restrict results to a specific store.Filters
– collection of additionalSearchFilter
instances.FacetDescriptors
andHasSelectedFacets
– describe and inspect facet selections.Skip
/Take
and the computedPageIndex
– control paging.Sorting
– sort expressions such as price or creation date.IsFuzzySearch
– enable fuzzy matching when supported.SpellCheckerMaxSuggestions
,SpellCheckerMinQueryLength
,SpellCheckerMaxHitCount
– configure suggestion generation.ResultFlags
– request hits, facets and/or suggestions.Origin
– identifies the source route (e.g. category page).CustomData
– extension bag for additional values.IsSubPage
–true
when paging or any facet selection is active.
Last updated
Was this helpful?