1

私は 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」というエラーが表示されます。

誰でも助けることができますか?

4

2 に答える 2

1

Criteria を使用する場合、式を使用してナビゲートすることはできません。エイリアスを明示的に指定する必要があります。

.CreateAlias("User", "User")
.Add(Expression.Eq("User.Company", requestingUser.Company));
于 2011-04-20T19:01:18.800 に答える
0

最終的に、次のようなサブクエリを使用する必要がありました。

var userSubquery = DetachedCriteria.For<UserAssignment>()
    .SetProjection(Projections.Property("Project")) // I had to put this reference property in the UserAssignment
    .CreateCriteria("User")
    .CreateCriteria("Company")
    .Add(Restrictions.Eq("Id", requestingUser.Company.Id));

var projectCriteria = DetachedCriteria.For<Project>()
    .Add(Restrictions.Or(
        Restrictions.Eq("OwnerCompany.Id", requestingUser.Company.Id),
        Subqueries.PropertyIn("Id", userSubquery)));

オブジェクトはプロジェクト以外にもいくつか適用できるため、オブジェクトにProjectプロパティを追加することは避けたかったのですが、それなしで基準を使用して結合を強制する方法がわかりませんでした。UserAssignmentSQL 式や HQL を使いたくありませんでした。

ジョシュ

于 2011-04-26T18:51:00.000 に答える