Linq NHibernate:QueryOver<&燃气轮机;帮助
我刚开始使用NHibernate,但在运行更复杂的查询时遇到了麻烦 我有一个附加标签列表的实体。用户将提供两个标签列表,包括和排除 我需要找到具有所有include标记的所有实体,并在排除列表中排除具有任何标记的任何实体 下面是我的第一个努力-这显然是错误的,因为它列出了所有包含任何include标记的显示对象,而不是all 任何援助都非常感激Linq NHibernate:QueryOver<&燃气轮机;帮助,linq,nhibernate,Linq,Nhibernate,我刚开始使用NHibernate,但在运行更复杂的查询时遇到了麻烦 我有一个附加标签列表的实体。用户将提供两个标签列表,包括和排除 我需要找到具有所有include标记的所有实体,并在排除列表中排除具有任何标记的任何实体 下面是我的第一个努力-这显然是错误的,因为它列出了所有包含任何include标记的显示对象,而不是all 任何援助都非常感激 var includeTagIds = (from tag in regime.IncludeTags select tag.Id).ToList<
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();
var includetagds=(从regime.IncludeTags中的标记选择tag.Id);
var excludeTagIds=来自体制中的标记。ExcludeTags选择tag.Id;
var displays=session.QueryOver()
.JoinQueryOver(display=>display.Tags)
.WhereRestrictionOn(tag=>tag.Id)
.IsIn(includetagds.List().Distinct();
返回displays.ToList();
这个查询并不琐碎(请考虑一下如何使用原始SQL进行查询)。我认为以下方法可行(需要两个相关的子查询):
显示displayAlias=null;
var CountIncludedTags查询=
(的)查询
.Where(d=>d.Id==displayAlias.Id)
.JoinQueryOver(d=>d.Tags)
.WhereRestrictionOn(t=>t.Id).IsInG(包括标记Id)
.Select(projects.RowCount());
不包括var的TAGSSUBQUERY=
(的)查询
.Where(d=>d.Id==displayAlias.Id)
.JoinQueryOver(d=>d.Tags)
.WhereRestrictionOn(t=>t.Id).IsInG(不包括数据标签)
.选择(t=>t.Id);
变量显示=
session.QueryOver(()=>displayAlias)
.WithSubquery.WhereValue(IncludedTagId.Count).Eq(countIncludedTagsSubquery)
.WithSubquery.WhereNotExists(不包括AgsSubQuery)
.List();
谢谢你的帮助,我试试看。我发现很多示例对于实际应用程序来说不够复杂。再次感谢
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();