NHibernate Linq Startwith 生成外连接

NHibernate Linq Startwith generates outer join

我有两个通过一对多关系连接的实体。 像这个例子:

public class Category
{
    public int Id {get; set; }
    public string Name {get; set;}
}

public class Product 
{
    public int Id {get; set;}
    public string Name {get; set;}
    public Category ProductCategory {get; set;}
}

以及使用 fluent nhibernate 的映射

public class CategoryMap : ClassMap<Category>
{
....
}

public Class ProductMap: ClassMap<Product>
{
...
References(x => x.ProductCategory).Column("CategoryId");
}

当我使用带有 where 子句和 equal 的 linq to NHibernate 进行搜索时,它会在产品和类别之间生成内部连接

所以这个

var query = session.Query<Product>()
     .Where (x => x.ProductCategory.Name == "abc");

这将生成内部连接

但是当我像这样使用 startwith 进行搜索时

var query = session.Query<Product>()
     .Where (x => x.ProductCategory.Name.StartWith("abc"));

这将在两者之间生成外连接。

为什么以及如何强制生成内部联接?

您可以使用 QueryOver 来完成,这是在 NHibernate 中创建查询的另一种方法。在这种情况下,您可以根据需要指定连接类型。

Category category = null;

var result = session.QueryOver<Product>()
                    .JoinAlias(x => x.ProductCategory, () => category, JoinType.InnerJoin)
                    .Where(Restrictions.Like(Projections.Property(() => category.Name), "abc%", MatchMode.Start))
                    .List();

另一方面,查询是更冗长的代码,您必须指定很多您避免使用 linq 的东西。