私はかなり長い間NHibernateを使用してきましたが、まだ「単純な」ことをするのに苦労しています。エンティティとmany-to-many
の間の関係を処理しようとしています。ServiceProvider
Features
基本的に、すべてSERVICE_PROVIDERS
のテーブルに存在する必要があるさまざまな機能を持つことができますFEATURES
。
これらは私のマッピングファイルです:
ServiceProviders.hbm.xml
、
<class name="App.Domain.ServiceProvider, App.Domain" table="ServiceProviders">
<id name="Code" type="System.Guid" unsaved-value="00000000-0000-0000-0000-000000000000">
<column name="ServiceProviderCode" />
<generator class="guid.comb" />
</id>
<property name="Description" type="AnsiString">
<column name="Description" length="150" not-null="true" />
</property>
<set name="Features" table="ServiceProvidersFeatures" access="field.pascalcase-underscore" cascade="save-update" optimistic-lock="false">
<key column="ServiceProviderCode"></key>
<many-to-many class="App.Domain.Feature" column="FeatureCode" not-found="exception" />
</set>
</class>
Features
、
<class name="App.Domain.Feature, App.Domain" table="Features">
<id name="Code" type="System.Guid" unsaved-value="00000000-0000-0000-0000-000000000000">
<column name="FeatureCode" />
<generator class="guid.comb" />
</id>
<property name="Description" type="AnsiString">
<column name="Description" length="150" not-null="true" />
</property>
<set name="ServiceProviders" table="ServiceProvidersFeatures" cascade="none" inverse="true" lazy="true" access="field.pascalcase-underscore" optimistic-lock="false" mutable="false">
<key column="FeatureCode"></key>
<many-to-many class="App.Domain.ServiceProvider" column="ServiceProviderCode" not-found="ignore" />
</set>
</class>
これらは 2 つの主要なクラスです。
ServiceProvider.cs
public class ServiceProvider
{
public ServiceProvider()
{
this._Features = new HashSet<Feature>();
}
public virtual Guid Code { get; protected set; }
public virtual string Description { get; set; }
private ICollection<Feature> _Features = null;
public virtual ReadOnlyCollection<Feature> Features
{
get { return (new List<Feature>(_Features).AsReadOnly()); }
}
}
Feature.cs
public class Feature
{
public Feature()
{
this._ServiceProviders = new HashSet<ServiceProvider>();
}
public virtual Guid Code { get; protected set; }
public virtual string Description { get; set; }
private ICollection<ServiceProvider> _ServiceProviders = null;
public virtual ReadOnlyCollection<ServiceProvider> ServiceProviders
{
get { return (new List<ServiceProvider>(_ServiceProviders).AsReadOnly()); }
}
}
私がやろうとしているのは、説明が特定の文字列で始まり、少なくとも 1 つの機能 (param) が指定されているすべてのサービス プロバイダー (すべての機能を含む) を取得することです。
サブクエリが必要だと思いますが、QueryOver の作成方法がわかりません。次のようになります。
var serviceProviders =
session.QueryOver<App.Domain.ServiceProvider>()
.Inner.JoinAlias(x => x.Features, () => features)
.WhereRestrictionOn(f => f.Description).IsLike("%" + "test" + "%")
.AndRestrictionOn(() => features.Code).IsIn(<SubQuery>)
.List();