在与Entity Framework一起专门工作了几年之后,我试图自学NHibernate。我知道如何编写查询,也知道如何编写带有EF和lambda表达式的代码,但是将其翻译为NHibernate会让我很困扰。

该查询将被写为:

SELECT fb.*
FROM foo f
INNER JOIN bar b ON f.fooid = b.fooid
INNER JOIN foobar fb ON b.barid = fb.barid
WHERE f.otherid = 1


基本上,我知道启动表(foo)的键,并且我想返回第二个联接表(foobar)中的所有匹配行。在EF中,我会写:

public IEnumerable<foobar> GetFooBarInfo(int intFooID)
{
    return db.foo.Include(f => f.bar)
                 .Include(fb => fb.bar.foobar)
                 .Where(f => f.otherentity.fooid == intFooID)
                 .Select(fb => fb.bar.foobar)
                 .ToList();
}


现在,将其转换为NHibernate是我需要的帮助。我尝试了几件事,但都没有保存,但是最新版本返回1行而不是7行。看起来它正在返回foobar中的一个行,其中barid = 1而不是所有barid值,其中fooid = 1

public IEnumerable<foobar> GetFooBarInfo(int intFooID)
{
    foo f = null;
    bar b = null;
    foobar fb = null;

    return db.QueryOver<foo>(() => f)
             .Where(fi => fi.otherentity.fooid == intFooID)
             .Inner.JoinQueryOver(ba => ba.bar, () => b)
             .Inner.JoinQueryOver(fbar => fbar.foobar, () => fb)
             .Select(Projections.ProjectionList()
                                .Add(Projections.Property(() => fb.barid))
                                .Add(Projections.Property(() => fb.barname))
                                .Add(Projections.Property(() => fb.bardescription))
                    )
             .TransformUsing(Transformers.AliasToBean<foobar>())
             .List<foobar>();
}


我还意识到它并没有真正填充投影/变换。 barid为0,barnamebardescription为空-这些显然在数据库中具有值。

最佳答案

我试图在foo上加入barfooid,但是bar有自己的主键foobarid。打开NHibernate的日志记录后,我可以看到生成的
查询不正确。它正在生成:

SELECT fb.*
FROM foo f
INNER JOIN bar b ON f.fooid = b.foobarid
INNER JOIN foobar fb ON b.barid = fb.barid
WHERE f.otherid = 1


因此,我意识到我需要包括bar的父表,该父表是baz以便正确连接。但这意味着我需要为
baz包括:

.HasMany(x => x.bar).KeyColumn("fooid")
.HasMany(x => x.foobar).KeyColumn("barid")


然后更改QueryOver以包括此附加表。这样可以正确计算结果,但仍然无法正确投影到对象中-一切都为空
直到我在每个Projection.Property()上添加了字符串别名:

public IEnumerable<foobar> GetFooBarInfo(int intFooID)
{
    foo f = null;
    bar b = null;
    baz bz = null;
    foobar fb = null;

    return db.QueryOver<foo>(() => f)
             .Where(fi => fi.otherentity.fooid == intFooID)
             .Inner.JoinQueryOver(bb => bb.baz, () => bz)
             .Inner.JoinQueryOver(ba => ba.bar, () => b)
             .Inner.JoinQueryOver(fbar => fbar.foobar, () => fb)
             .Select(Projections.ProjectionList()
                      .Add(Projections.Property(() => fb.barid), "barid")
                      .Add(Projections.Property(() => fb.barname), "barname")
                      .Add(Projections.Property(() => fb.bardescription), "bardescription")
             )
             .TransformUsing(Transformers.AliasToBean<foobar>())
             .List<foobar>();
}

关于c# - 从 Entity Framework 查询到NHibernate的转换困难,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27053624/

10-12 07:39
查看更多