如何使用NHibernate QueryOver有效地搜索记录并获取父记录

时间:2017-10-05 08:47:07

标签: c# queryover

我正在建立一个平台,网上商店可以创建自己的商店。 每个商店都有自己的Productcategory和关系(CategoryProductX)到Product条记录。因此,Product记录可以与来自不同商店的ProductCategory建立关系。 我的表看起来像这样:

ProductCategory
    Id
    Name
    ShopId

CategoryProductX
    Id
    CategoryId
    ProductId

Product
    Id
    Name

ProductCategoryProduct之间关系的映射如下所示:

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);

0 个答案:

没有答案