2012-06-20 3 views
1

J'ai une requête par linq pour nhibernate.Exception dans la requête linq pour l'utilisation "Type" pour le nom de la propriété

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

Il a une exception par ce message:

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."}

Mais renommer Type propriété pour Type1, Mon problème est résolu.

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

Pourquoi?

Une solution existe-t-elle pour l'utilisation du nom Type pour une propriété?

MISE À JOUR: classe La preuve est:

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

Stack Trace

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

Qu'est-ce que le stacktrace? –

+0

@OskarBerggren: J'ai ajouté 'Stack Trace'. – Ehsan

+0

On dirait que ça pourrait être un bug NH pour moi. Ce serait bien si vous pouviez créer un cas de test minimal qui exposerait le problème et vous soumettrait au programme de suivi des problèmes Jira de NHibernate. –

Répondre

0

Je crois que vous pouvez utiliser le symbole @ pour laisser le compilateur savoir que vous tapez un nom de propriété :

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

EDIT: hmm Je viens essayé de faire une situation mockup avec:

public class MyClass 
{ 
    public string Type; 
} 

et

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

et il semble être la compilation donc je vois maintenant ce n'est pas un problème de compilation (aurait dû être évident par votre question) mais peut-être un problème de réflexion ... alors laissez-moi savoir si le symbole @ le fixe ou non ...

+0

@Richardson: J'ai ajouté '@' char mais mon problème n'est pas résolu. – Ehsan

+0

Pouvez-vous essayer de créer une méthode de constructeur pour la classe 'Evidence' afin que vous n'ayez pas besoin d'utiliser l'initialiseur de type, puis utilisez le débogueur pour voir si vous pouvez obtenir des informations sur l'exécution échouer? Il me semble que ça devrait marcher ... très bizarre. –

+0

Le '@' permet également d'utiliser des mots-clés comme identifiants, par ex. '@ event'. Il n'indique pas un type particulier d'identifiant. –

Questions connexes