2012-06-20 35 views
1

我有一個由linq查詢到nhibernate。LINQ查詢異常使用屬性名稱的「類型」

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名稱的屬性?

UPDATE: 證據類是:

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) 
+0

什麼是堆棧跟蹤? –

+0

@OskarBerggren:我加了'Stack Trace'。 – Ehsan

+0

聽起來像它可能是一個NH臭蟲給我。如果你可以創建一個最小的測試用例來揭示問題並提交給NHibernate的Jira問題跟蹤器,那將會很好。 –

回答

0

我相信你可以使用@符號讓編譯器知道你鍵入一個屬性名稱:

var q = SessionInstance.Query<Evidence>() 
     .Select(x => new Evidence(x.Id) 
     { 
      Type = [email protected], 
      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}); 

,它似乎被編譯,所以我現在看到的這個是不是編譯時間問題(應該明顯是你的問題),但也許是一個反思問題...所以讓我知道,如果@符號實際上修復它或不...

+0

@Richardson:我加了'@'char但我的問題沒有解決。 – Ehsan

+0

您可以嘗試爲'Evidence'類創建構造函數方法,因此您不需要使用類型初始值設定項,然後使用調試程序來查看是否可以獲取有關它爲什麼的任何運行時信息失敗?在我看來,它應該工作......非常奇怪。 –

+0

'@'也允許使用關鍵字作爲標識符,例如, '@ event'。它不表示特定類型的標識符。 –

相關問題