3

Fluent NHibernateを使用して、ストアと従業員クラスを接続しました。ストアには、次のように多くの従業員を配置できます。

public class Store
{
    public virtual IList<Employee> Employees { get; set; }
    //other store properties
}

public class Employee
{
    public virtual Store Store { get; set; }   
    public virtual bool? SomeStatus1 { get; set; }
}

SomeStatus1がtrueに設定されていない従業員がいるすべてのストアを取得する必要があります。

ここでの私の実行可能な試みは失敗しました:

Session.CreateCriteria(typeof(Store))
    .Add(Restrictions.Not(Restrictions.Eq("Employees.SomeStatus1", true))
    .List<Store>();

私がそれをどうやってやるのか、何か考えはありますか?

私の試みが失敗した理由は、リストEmployeesにSomeStatus1のプロパティがないためです...これはかなり明白です。

私が知らないのは、NHibernateに、私が探している州に従業員がいる店舗だけを取得する方法です...

NHibernateに依頼したいのは、参加することだと思います...しかし、それを依頼する方法がわかりません...

4

3 に答える 3

5

サブ基準を作成して参加します

var criteria = Session.CreateCriteria(typeof(Store));
var join = criteria.CreateCriteria("Employees");
join.Add(Restrictions.Not(Restrictions.Eq("SomeStatus1", true));
return criteria.List<Store>();

テストされていない(obv)はそれが機能することを望んでいますが、あなたはその考えを理解しています。それが私がN:1でそれをする方法ですが、あなたは1:Nを持っています

編集:わかりました、投稿後に少し調査しました。私が行ったコードは機能するはずですが、employeesコレクションが読み込まれます。同じ基本的なコードがayendeのブログにあります。コレクションをリロードせずに同じことを行うサンプルがあります。お役に立てば幸いです。

于 2010-07-21T02:31:56.737 に答える
1

試す:

Session.CreateCriteria(typeof(Store))
.CreateAlias("Employees", "e")
.Add(Restrictions.Not(Restrictions.Eq("e.SomeStatus1", true))
.List<Store>();
于 2010-07-21T10:57:25.783 に答える
0

CriteriaAPIの代わりにLinqtoNHibernateAPIを使用することをお勧めします。これを使用すると、クエリは次のようになります。

var query = Session.Linq<Store>()
    .Where(store => store.SomeStatus1 != true);

var result = query.ToList();

ここでより多くのヘルプ。

于 2010-07-21T05:44:55.973 に答える