gpt4 book ai didi

linq - NHibernate:QueryOver<> 帮助

转载 作者:行者123 更新时间:2023-12-03 12:25:41 26 4
gpt4 key购买 nike

我刚开始使用 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();

最佳答案

该查询并非微不足道(想一想如何使用原始 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();

关于linq - NHibernate:QueryOver<> 帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2959464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com