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
的东西。
我有两个通过一对多关系连接的实体。 像这个例子:
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
的东西。