我正在建立一个平台,网上商店可以创建自己的商店。
每个商店都有自己的Productcategory
和关系(CategoryProductX
)到Product
条记录。因此,Product
记录可以与来自不同商店的ProductCategory
建立关系。
我的表看起来像这样:
ProductCategory
Id
Name
ShopId
CategoryProductX
Id
CategoryId
ProductId
Product
Id
Name
ProductCategory
和Product
之间关系的映射如下所示:
private IList<CategoryProductX> products = new List<CategoryProductX>();
[Bag(0, Name = "Products", Table = "CategoryProductX", Inverse = true)]
[Key(1, Column = "CategorieId")]
[OneToMany(2, ClassType = typeof(CategoryProductX))]
public virtual IEnumerable<CategoryProductX> Products
{
get { return products; }
protected set { products = (IList<CategoryProductX>)value; }
}
我之前已经实现了搜索功能,该搜索功能仅在用户选择的ProductCategory
内搜索产品并完全在客户端上执行搜索。我们想要更改它,以便它搜索当前Shop
的整个目录。
由于我不想总是从数据库中检索整个目录只是为了能够在客户端上执行搜索,我们必须在服务器上移动此功能。
搜索结果应为List<ProductCategoryDTO>
,其中包含属性public List<ProductDTO> Products
。
我有一些有用的东西,但我想确保它有效,因为每次用户在搜索框中输入一个字符时都会执行。
ProductCategory categoryAlias = null;
CategoryProductX categoryProductAlias = null;
Product productAlias = null;
var query = session.QueryOver<ProductCategory>(() => categoryAlias)
.Where(() => categoryAlias.Shop.Id == shopId)
.JoinQueryOver(() => categoryalias.Products, () => categoryProductAlias)
.JoinQueryOver(() => categoryProductAlias.Product, () => productAlias);
query.Where(Restrictions.Disjunction()
.Add(Restrictions.InsensitiveLike("Name", searchTerm, MatchMode.Anywhere)));
ProductCategoryDTO category = null;
ProductDTO product = null;
var productResults = query.SelectList(list => list
.Select(() => productAlias.Id).WithAlias(() => product.Id)
.Select(() => productAlias.Name).WithAlias(() => product.Name)
.Select(() => categoryProductAlias.CategoryId).WithAlias(() => product.CategoryId).TransformUsing(Transformers.AliasToBean<ProductDTO>())
.List<ProductDTO>();
var categories = query
.Where(c => c.Id.IsIn(productResults.Select(p => p.CategoryId).ToArray()))
.SelectList(list => list
.Select(() => categoryAlias.Id).WithAlias(() => category.Id)
.Select(() => categoryAlias.Name).WithAlias(() => category.Name)
)
.TransformUsing(Tranformers.AliasToBean<CategoryDTO>())
.List<CategoryDTO>().Distinct();
if(categories.Any())
{
foreach(var category in categories)
{
category.Product = productResults.Where(p => p.CategoryId == category.Id).ToList();
}
}
Result = categories;
return Task.FromResult(0);