[英]Trouble transitioning from Entity Framework query to NHibernate
在与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 = 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
为空-这些显然在数据库中具有值。
我试图在fooid
上加入foo
和bar
,但是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>();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.