我们遇到了NHibernate LINQ提供程序的意外行为。我们尝试连接两个实体并选择一个投影,每个投影有时会产生NotSupportedException
。
如果在查询的from
子句中定义了投影,则可以编译查询。例如:
var query = from team in session.Query<TeamEntity>()
.Select(team => new TeamModel
{
TeamId = team.Id,
Shortname = team.Shortname
})
join player in session.Query<PlayerEntity>()
on team.TeamId equals player.TeamId
select new PlayerModel
{
PlayerId = player.Id,
TeamId = team.TeamId,
Shortname = team.Shortname,
Name = player.Name
};
query.ToList();
上面的语句编译成以下SQL语句(替换生成的名称):
select player.Player_Id, team.Team_Id, team.Shortname, player.Name
from DalTest_Team team, DalTest_Player player
where player.Team_Id=team.Team_Id
如果在查询的join
子句中定义了投影,则无法编译查询 。例如:
var query = from player in session.Query<PlayerEntity>()
join team in session.Query<TeamEntity>()
.Select(team => new TeamModel
{
TeamId = team.Id,
Shortname = team.Shortname
})
on player.TeamId equals team.TeamId
select new PlayerModel
{
PlayerId = player.Id,
TeamId = team.TeamId,
Shortname = team.Shortname,
Name = player.Name
};
query.ToList();
我们不明白为什么投影是from
或join
语句的一部分的一部分会有所不同。这种行为有任何技术原因吗?
您可能会问为什么我们希望稍后根据投影定义投影和连接。在我们希望的情况下,我们希望解耦我们的应用程序的业务领域。这些部分不应该了解彼此的实体。此外,可能涉及两个以上的业务领域,这意味着from
子句中的投影方法并不能完全解决我们的问题。
以下GitHub存储库中有一个功能齐全的单元测试项目。可以使用NuGet恢复所有必需的依赖项,包括SQLite。
https://github.com/claudiobernasconi/NHibernateProjectionJoins