等价于NHibernate中的INNER JOIN ... WHERE

时间:2018-10-01 19:06:32

标签: c# linq nhibernate

我有一个Category的类List<Subcategory>

(最好)使用LINQ,我想获得所有 Categories s,但 filtering 他们的Subcategorie s,使查询结果看起来像喜欢:

SELECT * FROM categories
LEFT JOIN subcategories ON subcategories.category_Id = categories.id WHERE subcategories.Retired = false

我尝试过:

session.QueryOver<Category>()
.Left.JoinQueryOver(c => c.Subcategories, () => subcategoryAlis, s => !s.Retired)
.List<Category>())

还有其他一些看起来很怪异的花招,但我似乎无法获得所需的结果。上面的查询产生完全无用的结果,相同的条目出现多次,而很多条目丢失。

2 个答案:

答案 0 :(得分:0)

自从我使用NHibernate已经有一段时间了,但是我会使用一些专用的DTO类来做到这一点,而不是直接从实体中转换为Json。我认为遵循以下linq查询的方法应该可以工作:

from c in session.Query<Category>
select new CategoryDto {
  Name = c.Name, //and other properties
  SubCategories = c.SubCategories
    .Where(sc => !sc.Retired)
    .Select(sc => new SubCategoryDto { ... })
    .ToList()
}

答案 1 :(得分:0)

您的标题和所需内容的示例有些矛盾。 如果您需要检索具有过滤子类别的所有类别(因此列表应包括不包含子类别的类别和具有所有过滤子类别的类别),则比INNER JOIN .. WHERE并不是您所需要的。您需要将LEFT JOIN过滤为ON

SELECT * FROM categories
LEFT JOIN subcategories ON subcategories.category_Id = categories.id AND subcategories.Retired = false  

在QueryOver中,它将是以下查询:

session.QueryOver<Category>()
.Left.JoinQueryOver(c => c.Subcategories, () => subcategoryAlis, s => !s.Retired)
.TransformUsing(Transformers.DistinctRootEntity)
.List<Category>()

如果您只需要检索不包含退休子类别的类别:

SELECT * FROM categories
INNER JOIN subcategories ON subcategories.category_Id = categories.id
WHERE subcategories.Retired = false 

然后在QueryOver中它将如下所示:

session.QueryOver<Category>()
.Left.JoinQueryOver<Subcategory>(c => c.Subcategories)
.Where(s => s.IsRetired == false)
.TransformUsing(Transformers.DistinctRootEntity)
.List<Category>()

请注意:您仍然需要在QueryOver中使用LEFT连接,否则NHibernate将不会获取子类别。在这两种情况下,您都需要使用Transformers.DistinctRootEntity来消除结果中父对象重复项。