NHibernate 和“匿名”实体

发布于 2024-11-14 21:08:23 字数 652 浏览 0 评论 0原文

我有这些实体:

public class Parent
{
    public int Foo { get; set; }
    public Child C { get; set; }
}

public class Child
{
    public string Name { get; set; }
}

我有一个查询,它从数据库中获取所有父实体。然后我将它们保存在内存中,并使用 LINQ 查询过滤它们。

我注意到,当我执行数据库查询时,NH 在一个查询中选择所有父实体(当然还填充 Foo 属性),并且对于我使用 LINQ 访问的每个父实体,NH 获取每个子实体的信息。

我怎样才能在一个唯一的数据库中获取我需要的所有信息,并在没有 LINQ 的情况下使用这些数据来生成额外的数据库行程?

我应该使用 AliasToBeanResultTransformer 吗?如果是这样,我必须创建一个 DTO 来存储信息,例如:

public class ParentDTO
{
    public int Foo { get; set; }
    public string ChildName { get; set; }
}

或者我仍然必须使用 Parent 类吗?

提前致谢

I have these entities:

public class Parent
{
    public int Foo { get; set; }
    public Child C { get; set; }
}

public class Child
{
    public string Name { get; set; }
}

I have query which fetches all Parent entities from the database. Then I keep them in memory, and filter them using LINQ queries.

I have noticed that when I do the DB query, NH selects all the Parent entities in one query (and of course fills the Foo property), and for each Parent I access with LINQ, NH fetches the infos of each Child.

How can I do to fetch all infos I need in one unique DB, and use the data with LINQ without it to generate additional DB trips?

Should I use the AliasToBeanResultTransformer? If so, must I create a DTO which will store the infos, like:

public class ParentDTO
{
    public int Foo { get; set; }
    public string ChildName { get; set; }
}

or must I still use the Parent class?

Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谷夏 2024-11-21 21:08:23

您可以像这样急切加载此查询的子项(使用 QueryOver 语法)

public IList<Parent> FindAllParentsWithChildren()
{
  ISession s = // Get session
  return s.QueryOver<Parent>()
    .Fetch(p => p.C).Eager
    .List<Parent>();
}

另一种方法是更改​​ HBM 文件以指示默认情况下急切加载子项。那么您将不需要更改您的查询。

You can eagerly load the children for this query like this (using QueryOver syntax)

public IList<Parent> FindAllParentsWithChildren()
{
  ISession s = // Get session
  return s.QueryOver<Parent>()
    .Fetch(p => p.C).Eager
    .List<Parent>();
}

An alternative is to change your HBM files to indicate that Child is eagerly loaded by default. Then you won't need to alter your query.

他夏了夏天 2024-11-21 21:08:23

您需要告诉 NHibernate 不要对父实体和子实体之间的关系使用延迟加载。

You need to tell NHibernate not to use lazy loading for the relationship between the Parent and Child entities.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文