8

私は次の行に沿ってSQLを生成しようとしています:

SELECT 
  t.*, 
  SELECT (...)
FROM Title t
[trimmed]

QueryOverを使用する

Title title = null;

var q = session
   .QueryOver(() => title)
   .Select(
      Projections.Alias(Projections.Property<Title>(t => t.Id), "Id"),
      Projections.Alias(Projections.Property<Title>(t => t.Name), "Name"),
      ....
      Projections.SubQuery(sq.Where(tt => tt.Id == title.Id))), "TopLevelGenre")
)
[code trimmed]

タイトルには、私が投影したい15のプロパティがあります。上記で始めたように、各プロパティを個別に投影する必要がないように、それを行う簡単な方法はありますか?

4

7 に答える 7

3

ICriteriaを気にしない場合、これは機能します。2.1.2でテストしましたが、3.xで動作しない理由がわかりません。

var projectionList = Projections.ProjectionList();
var metadata = session.SessionFactory.GetClassMetadata(typeof(Title));
foreach (var name in metadata.PropertyNames)
{
    projectionList.Add(Projections.Property(name), name);
}
var criteria = DetachedCriteria.For<Title>()
   .SetProjection(projectionList)
   ...;
于 2011-11-07T17:20:05.220 に答える
2

NHibernate 3.2の時点では、すべてのプロパティを手動で列挙しないとこれは不可能であることがわかりました。

于 2011-06-28T17:38:47.110 に答える
1

すべてのプロパティを手動で列挙せずにこれを行うことはできません。私は通常、CodeSmithを使用して投影コードを生成します。

于 2012-03-10T02:05:55.533 に答える
0

Titleオブジェクトが必要な場合は、次のように記述できます。

IList<Title> list = session.QueryOver<Title>.Where(/*some condition*/).List();  

nHibernateはすべてのTitle属性を設定します。
詳細については、こちらをご覧ください。

于 2011-04-24T23:07:08.057 に答える
0

関心のある列を使用してタイトルテーブルにビューを作成することはできますか?または、Titleクラスのプロパティを2つのクラス(TitleBaseクラスとTitleBaseクラスから継承されたTitleクラス)に分割してみてください。したがって、2つの別々のマッピングファイルを作成する必要があります。

関心のあるすべてのプロパティがTitleBaseクラスにある場合は、上記のクエリでそれを使用します。

于 2011-04-25T09:36:56.727 に答える
0

私はこのコードでそれを解決しました。それがあなたに役立つことを願っています。私はバッグを使用しています。たとえば、ISetを使用する必要がある場合は、比較を変更してください。PDMは、リフレクションを適用しているプロパティのエンティティです。このメソッドを汎用に変更できます。

        ProjectionList list = Projections.ProjectionList();            
        var metadata = session.SessionFactory.GetClassMetadata(typeof(PDM));

        foreach (var name in metadata.PropertyNames)
        {
            PropertyInfo property = typeof(PDM).GetProperties(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(x => x.Name.Equals(name));
            FieldInfo field = typeof(PDM).GetFields(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(x => x.Name.Equals(name));

            if (property != null)
            {
                if (!property.PropertyType.Name.Contains("IList"))
                {
                    list.Add(Projections.Property(name), name);
                }
            }

            if (field != null)
            {
                if (!field.FieldType.Name.Contains("IList"))
                {
                    list.Add(Projections.Property(name), name);
                }
            }
        }          
于 2013-10-14T10:45:14.567 に答える
0

NHibernate 5.1では、エンティティプロジェクションを介して可能です:

Title title = null;

var q = session
   .QueryOver(() => title)
   .Select(
      Projections.Entity(() => title),
      Projections.SubQuery(sq.Where(tt => tt.Id == title.Id))), "TopLevelGenre")
)
于 2018-04-19T05:17:47.570 に答える