我刚刚开始使用NHibernate,我在运行更复杂的查询时遇到了麻烦。
我有附加标签列表的实体。用户将提供两个标签列表,包括和排除。
我需要查找包含所有包含标记的所有实体,并排除排除列表中包含任何标记的所有实体。
下面是我的第一个努力 - 这显然是错误的,因为它列出了所有包含任何包含标签的Display对象而不是全部!
任何帮助都是非常明确的。
var includeTagIds = (from tag in regime.IncludeTags select tag.Id).ToList<int>();
var excludeTagIds = from tag in regime.ExcludeTags select tag.Id;
var displays = session.QueryOver<Display>()
.JoinQueryOver<DisplayTag>(display => display.Tags)
.WhereRestrictionOn(tag => tag.Id)
.IsIn(includeTagIds).List().Distinct();
return displays.ToList();
答案 0 :(得分:14)
该查询并不简单(考虑如何使用原始SQL执行此操作)。我认为以下内容将起作用(需要两个相关的子查询):
Display displayAlias = null;
var countIncludedTagsSubquery =
QueryOver.Of<Display>()
.Where(d => d.Id == displayAlias.Id)
.JoinQueryOver<DisplayTag>(d => d.Tags)
.WhereRestrictionOn(t => t.Id).IsInG(includedTagIds)
.Select(Projections.RowCount());
var excludedTagsSubquery =
QueryOver.Of<Display>()
.Where(d => d.Id == displayAlias.Id)
.JoinQueryOver<DisplayTag>(d => d.Tags)
.WhereRestrictionOn(t => t.Id).IsInG(excludedTagIds)
.Select(t => t.Id);
var displays =
session.QueryOver<Display>(() => displayAlias)
.WithSubquery.WhereValue(includedTagIds.Count).Eq(countIncludedTagsSubquery)
.WithSubquery.WhereNotExists(excludedTagsSubquery)
.List();