Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq NHibernate:QueryOver<&燃气轮机;帮助_Linq_Nhibernate - Fatal编程技术网

Linq NHibernate:QueryOver<&燃气轮机;帮助

Linq NHibernate:QueryOver<&燃气轮机;帮助,linq,nhibernate,Linq,Nhibernate,我刚开始使用NHibernate,但在运行更复杂的查询时遇到了麻烦 我有一个附加标签列表的实体。用户将提供两个标签列表,包括和排除 我需要找到具有所有include标记的所有实体,并在排除列表中排除具有任何标记的任何实体 下面是我的第一个努力-这显然是错误的,因为它列出了所有包含任何include标记的显示对象,而不是all 任何援助都非常感激 var includeTagIds = (from tag in regime.IncludeTags select tag.Id).ToList<

我刚开始使用NHibernate,但在运行更复杂的查询时遇到了麻烦

我有一个附加标签列表的实体。用户将提供两个标签列表,包括和排除

我需要找到具有所有include标记的所有实体,并在排除列表中排除具有任何标记的任何实体

下面是我的第一个努力-这显然是错误的,因为它列出了所有包含任何include标记的显示对象,而不是all

任何援助都非常感激

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();