2

NHibernate実装によるアプリケーションがあります。私のプロジェクトにはPersonClass があります:

public class Person : RootEntityBase
{    
    virtual public string FirstName { get; set; }
    virtual public string LastName { get; set; }
    virtual public string FatherName { get; set; }

    virtual public IList<Asset> Assets { get; set; }
    virtual public IList<PersonPicture> PersonPictures { get; set; }
}

このマッピングにより:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Entities">
  <class name="Person" table="Person_Person" >

    <id name="Id">
      <generator class="native" />
    </id>

    <property name="FirstName" not-null="true"/>

    <property name="LastName" not-null="true"/>

    <property name="FatherName" not-null="true"/>

    <bag name="Assets" inverse="true" table="Person_Asset" cascade="all-delete-orphan" >
      <key column="Person_id_fk"/>
      <one-to-many class="Asset"/>
    </bag>

    <bag name="PersonPictures" inverse="true" table="Person_PersonPicture" cascade="all-delete-orphan" >
      <key column="Person_id_fk"/>
      <one-to-many class="PersonPicture"/>
    </bag>

  </class>

Person のいくつかのプロパティを選択する linq によるクエリが必要です。

var q = SessionInstance.Query<Person>()
               .Select(x => new Person(x.Id)
                                  {
                                      FirstName = x.FirstName,
                                      LastName = x.LastName,
                                      PersonPictures = x.PersonPictures //this line has error
                                  })
               .ToList();

選択に追加PersonPicturesすると、このクエリには次のメッセージによる実行時例外があります。

could not execute query\r\n[ select person0_.Id as col_0_0_, person0_.FirstName as col_1_0_, person0_.LastName as col_2_0_, ...

内部例外のメッセージは次のとおりです。

Incorrect syntax near the keyword 'as'.

スタック トレースは次のとおりです。

   at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
   at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
   at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes)
   at NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters)
   at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters)
   at NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results)
   at NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results)
   at NHibernate.Impl.AbstractSessionImpl.List(IQueryExpression queryExpression, QueryParameters parameters)
   at NHibernate.Impl.ExpressionQueryImpl.List()
   at NHibernate.Linq.NhQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery)
   at NHibernate.Linq.NhQueryProvider.Execute(Expression expression)
   at NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression expression)
   at Remotion.Data.Linq.QueryableBase`1.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

これどうやってするの?

4

3 に答える 3

0

私はLinqTonHibernate忍者ではありませんが、次はどうですか?

var q = SessionInstance.Query<Person>().Fetch(p => p.PersonPictures).ToList();

その投影を行う必要がありますか?必要に応じて追加することもできますが、回答から省略しました。

参照:

NHibernateのLinqおよび熱心な読み込みのフェッチモード

NHibernateLinqプロバイダーのFetchvsFetchMany

http://mikehadlow.blogspot.co.nz/2010/08/nhibernate-linq-eager-fetching.html

于 2012-11-13T07:16:43.773 に答える
0

なぜ次のクエリを作成しようとしているのか理解できません。

var q = SessionInstance.Query<Person>()
           .Select(x => new Person(x.Id)
                              {
                                  FirstName = x.FirstName,
                                  LastName = x.LastName,
                                  PersonPictures = x.PersonPictures //this line has error
                              })
           .ToList();

マッピングとドメイン クラスは正しいようです。したがって、次の手順に進む必要があります。

IList<Person> persons = (from p in SessionInstance.Query<Person>()
select p).ToList();

写真にフィルターを適用する場合:

IList<Person> persons = (from p in SessionInstance.Query<Person>()
select p
where p.PersonPictures.Any(pp => pp.Property == [...]).ToList();

すべてのプロパティを再マップする必要はありません。これは、NHibernate マッピング + NHibernate LINQ プロバイダーの仕事です。

于 2012-11-13T10:10:21.433 に答える
0

あなたのマッピングは正しいです。Criteria API を使用すると、期待どおりの結果を得ることができます。

ただし、参照している問題は既知であり、報告されています: https://nhibernate.jira.com/browse/NH-2707

しかし、私は修正されていないのではないかと心配しています。したがって、(このシナリオで) 基準を使用できる場合:

// example returning the complete list
var query = session.CreateCriteria<Preson>().List<Person>(); 

次に、続行できます。

query.Select(x => new Person(x.Id)
...
于 2012-11-13T07:31:34.380 に答える