gpt4 book ai didi

c# - NHibernate 在许多查询中产生多对多结果

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:40 24 4
gpt4 key购买 nike

我正在 ASP.NET MVC 中开发一个书签系统,我使用 NHibernate 来查询数据库。

我有一个多对多的关系:

  • 一个书签可以有多个标签
  • 一个标签可以有多个书签

模型:

public class Bookmark
{
public virtual string Title { get; set; }
public virtual string Link { get; set; }
public virtual User User { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}

public class Tag
{
public virtual string Title { get; set; }
public virtual string Description { get; set; }
public virtual User User { get; set; }
public virtual ICollection<Bookmark> Bookmarks { get; set; }
}

我想获取一个标签,循环遍历它的书签,并为每个书签循环遍历它的标签。为此,我使用了这个:

public Tag GetTagByTitle(string username, string title)
{
ICriteria criteriaQuery = SessionFactory.GetCurrentSession()
.CreateCriteria(typeof(Tag))
.SetFetchMode("Bookmarks", FetchMode.Eager)
.CreateAlias("User", "User")
.Add(Restrictions.Eq("Title", title))
.Add(Restrictions.Eq("User.Username", username));

IList<Tag> tags = criteriaQuery.List<Tag>();
Tag tag = tags.FirstOrDefault();

return tag;
}

这给了我一个带有书签的标签。然而,对于每个书签,它会自动执行另一个查询以获取其标签(延迟加载?)。所以如果我有 10 个书签,我会得到 1 + 10 个查询。是否可以通过一个或两个查询来做到这一点?

NHibernate Profiler 示例(3 个书签):

Example with NHibernate Profiler (3 bookmarks)

最佳答案

您可以使用 CreateAlias急切地获取书签,它还允许您更深入地挖掘另一层以指定您希望如何获取标签。

ICriteria criteriaQuery = SessionFactory.GetCurrentSession()
.CreateCriteria(typeof(Tag))
.CreateAlias("Bookmarks", "b", JoinType.LeftOuterJoin)
.CreateAlias("b.Tags", "bt", JoinType.LeftOuterJoin)
.CreateAlias("User", "User")
.Add(Restrictions.Eq("Title", title))
.Add(Restrictions.Eq("User.Username", username))
.SetResultTransformer(Transformers.DistinctRootEntity);

编辑:固定查询。对此感到抱歉。显然 SetFetchMode仅适用于直接脱离查询根实体的关系。将其替换为 CreateAlias解决了这个问题。

对于集合的所有这些左外连接,您需要稍微修改您的实体并更新您的映射以防止重复的条目出现在集合中。而不是 ICollection<T> , 使用 ISet<T>来自 Iesi.Collections.Generic命名空间,并更改映射以使用 <set/>而不是 <bag/> .

关于c# - NHibernate 在许多查询中产生多对多结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18465054/

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