Я изменил свой запрос следующим образом:
return Session.CreateQuery("from Player p where p.Sex = :teamSex and p.Visible and not exists (from PlayerInTeam pit where pit.Player = p and pit.Roster.Team = :teamId)")
.SetParameter("teamId", team.Id)
.SetParameter("teamSex", team.Sex)
.Enumerable<Player>();
И теперь это работает. У меня появилась идея использовать «не существует» после того, как я изменил свои сопоставления, чтобы попытаться использовать LINQ, что подсказало мне.
Если вы спросите, почему я не сохраняю LINQ, это потому, что в настоящее время я скрываю отношения между своими сущностями как частные поля, чтобы заставить пользователей сущностей использовать вспомогательные функции, которые их связывают. Но неправильно то, что в большинстве случаев это запрещает мне использовать LINQ в моих репозиториях.
Но мне интересно, не лучше ли было бы "скрыть" мои отношения и выставить их как публичные свойства, но сохранить мои вспомогательные функции. Это позволило бы мне использовать LINQ в моих запросах.
Что вы делаете в своих приложениях, используя NH?
Считаете ли вы, что это будет приемлемым компромиссом для поддержки простых отображений и запросов (с использованием LINQ), но с ценой некоторых потенциальных злоупотреблений сущностями, если пользователь не использует вспомогательные функции, которые сохранить отношения?