我有一个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>())
还有其他一些看起来很怪异的花招,但我似乎无法获得所需的结果。上面的查询产生完全无用的结果,相同的条目出现多次,而很多条目丢失。
答案 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来消除结果中父对象重复项。