1

linqによるnhibernateへのクエリがあります。

var q = SessionInstance.Query<Evidence>()
       .Select(x => new Evidence(x.Id)
        {
            Type = x.Type,
            StartDate = x.StartDate,
            EndDate = x.EndDate
        })    
        .ToList();

このメッセージには例外があります:

NHibernate.Exceptions.GenericADOException : Could not execute query[SQL: SQL not available] {"Exception has been thrown by the target of an invocation."} {"Specified cast is not valid."}

しかし、Typeプロパティの名前をに変更することType1で、私の問題は解決しました。

q = q.Select(x => new Evidence(x.Id)
    {
        Type1 = x.Type1,
        StartDate = x.StartDate,
        EndDate = x.EndDate
    });

なんで?

プロパティの使用Type名の解決策はありますか?

更新: エビデンスクラスは:

public class Evidence
{
    public long Id;
    public EvidenceEnumType? Type;
    public DateTime? StartDate;
    public DateTime? EndDate;
}

スタックトレース

  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[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)
   at RCISP.NHibernate.Repository.EvidenceIssuanceRepositoryNh.Search(SearchEvidenceIssuanceDto dto)
   at RCISP.Domain.Services.EvidenceIssuanceService.SearchCommand(IRepositoryLocator locator, SearchEvidenceIssuanceDto dto) in D:\Users\Zeynali\Aseman\src\RCISP.Domain\Services\Issuance\EvidenceIssuanceService.cs:line 62
   at RCISP.Domain.Services.EvidenceIssuanceService.<>c__DisplayClass4.<Search>b__3(IRepositoryLocator locator) in D:\Users\Zeynali\Aseman\src\RCISP.Domain\Services\Issuance\EvidenceIssuanceService.cs:line 58
   at RCISP.NHibernate.TransManager.TransManagerNh.ExecuteCommand[TResult](Func`2 command)
4

1 に答える 1

0

シンボルを使用して@、プロパティ名を入力していることをコンパイラに知らせることができると思います。

var q = SessionInstance.Query<Evidence>()
       .Select(x => new Evidence(x.Id)
        {
            Type = x.@Type,
            StartDate = x.StartDate,
            EndDate = x.EndDate
        })    
        .ToList();

編集:うーん、私はちょうどモックアップの状況を作ってみました:

public class MyClass
{
    public string Type;
}

var y = new List<MyClass>().Select(x => new MyClass() {Type = x.Type});

コンパイルしているように見えるので、これはコンパイル時の問題ではなく(あなたの質問で明らかだったはずです)、おそらくリフレクションの問題であることがわかりました...@シンボルが実際に修正するかどうかを教えてください.. .

于 2012-06-20T05:43:53.177 に答える