私は最近NHibernateを使い始めましたが、さらに下に概説したドメインモデルの実装に問題があります。
私が探しているのは、特定のデータストア上のアイテムとそのアイテムデータコレクションの間の関係をフィルタリングする方法です。データストアはグローバルであり、その場合は常に返されるか、(アプリケーションインスタンスに基づいて)ユーザーIDに固有です。
SQLでは、これは単純なクエリを使用して実行できます。
SELECT * FROM Items i
INNER JOIN ItemData id ON (i.ItemId=id.ItemId)
LEFT OUTER JOIN Users u ON (id.UserId=u.UserId)
LEFT OUTER JOIN DataStore ds ON (id.DataStoreId=ds.DataStoreId)
WHERE ds.IsGlobal = 1 OR ds.UserId = @userId
データベース構造:
DataStore:
- DataStoreId (PK)
- Name
- Weight
- UserId
- IsGlobal
Item:
- ItemId (PK)
- ... (non-nullable fields)
ItemData:
- ItemDataId (PK)
- ItemId
- DataStoreId
- ... (nullable fields)
ドメインモデル:
public class ItemMap : ClassMap<Item>
{
public ItemMap()
{
Id(x => x.Id, "ItemId");
HasMany(x => x.Data)
.KeyColumn("ItemId")
.ApplyFilter<ItemDataFilter>(..?)
.Cascade.AllDeleteOrphan();
}
}
基本的な理論は、データストアごとに1つのItemData行をフェッチし、それぞれのデータストアの重みフィールドの各列を結合することです(重みで並べ替えられた最初の非null値)。
NHibernateでこれを達成できるかどうか、またどのように達成できるかについての洞察をいただければ幸いです。