私は NHibernate を初めて使用し、NHibernate の Criteria エンジンを使用して SQL を表現する最良の方法を見つけるのに苦労しています。オブジェクト モデルの基本的な説明を次に示します。
public class Project : EntityBase<Project>
{
// Properties for a project
public virtual Company OwnerCompany { get; set; }
public virtual IList<UserAssignment> UserAssignments { get; set; }
}
public class Company : EntityBase<Company>
{
// Properties for a company
}
public class User : EntityBase<User>
{
// Properties for a user
public virtual Company Company { get; set; }
}
public class UserAssignment : EntityBase<UserAssignment>
{
// Properties for an assignment
public virtual User User { get; set; }
}
基礎となるテーブルがどのように見えるかをクラスから推測でき、すべての NH は EntityBase 抽象クラスにあります。
基本的に、特定の会社が所有する、またはその会社の誰かのために UserAssignments を持つすべてのプロジェクトをプルしたいと考えています。SQLでそれを行う方法は次のとおりです。
select P.*
from Project P
where P.OwnerCompany_Id = @CompanyId
or P.Id in (
select Project_Id
from UserAssignment UA
join User U on UA.User_Id = U.Id
where U.Company_Id = @CompanyId
)
私は DetachedCriteria を使用していますが、UserAssignment のユーザーを会社に一致させるだけでは機能しません。ましてや、割り当てと所有者の両方を一致させることはできません。私がこれを試したとき:
var criteria = DetachedCriteria
.For<Project>()
.CreateCriteria("UserAssignments")
.Add(Expression.Eq("User.Company.Id", requestingUser.Company.Id));
「プロパティを解決できませんでした: TestProject.Domain.UserAssignment の User.Company.Id」というエラーが表示されます。
誰でも助けることができますか?