NHibernate:QueryOver <>帮助

And*_*ker 7 linq nhibernate

我刚刚开始使用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();
Run Code Online (Sandbox Code Playgroud)

小智 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();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的帮助,我会试一试.我发现很多例子对于实际应用来说都不够复杂.再次感谢 (6认同)