在与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,barname
和bardescription
为空-这些显然在数据库中具有值。 最佳答案
我试图在foo
上加入bar
和fooid
,但是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/