我有一個基本的NHibernate.Linq查詢:ArgumentOutOfRangeException使用LINQ的ToString NHibernate的查詢
var items = from item in session.Linq<ObjectType>()
where item.ID > 0
select new { ID = item.ID, Type = item.ClassName };
這工作得很好。但是,ObjectType是一個重量級的類,我只想要ID和ClassName。所以,我創建了一個名爲DTO EntityInfo
:
public class EntityInfo
{
public String ID { get; set; }
public String Type { get; set; }
}
而且我想返回IEnumerable<EntityInfo>
:
return from item in session.Linq<ObjectType>()
select new EntityInfo() { ID = item.ID.ToString(), Type = item.ClassName };
在試圖通過返回的IEnumerable遍歷,不過,我得到以下異常:
System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) at System.ThrowHelper.ThrowArgumentOutOfRangeException() at System.SZArrayHelper.get_Item[T](Int32 index) at System.Collections.ObjectModel.ReadOnlyCollection`1.get_Item(Int32 index) at NHibernate.Linq.Visitors.SelectArgumentsVisitor.VisitMethodCall(MethodCallExpression expr) at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) at NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(Expression exp) at NHibernate.Linq.Visitors.ExpressionVisitor.VisitList(ReadOnlyCollection`1 original) at NHibernate.Linq.Visitors.ExpressionVisitor.VisitNew(NewExpression nex) at NHibernate.Linq.Visitors.SelectArgumentsVisitor.VisitNew(NewExpression expr) at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) at NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(Expression exp) at NHibernate.Linq.Visitors.RootVisitor.HandleSelectCall(MethodCallExpression call) at NHibernate.Linq.Visitors.RootVisitor.VisitMethodCall(MethodCallExpression expr) at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) at NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(Expression exp) at NHibernate.Linq.Visitors.NHibernateQueryTranslator.Translate(Expression expression, QueryOptions queryOptions) at NHibernate.Linq.NHibernateQueryProvider.TranslateExpression(Expression expression) at NHibernate.Linq.NHibernateQueryProvider.Execute(Expression expression) at NHibernate.Linq.Query`1.GetEnumerator()
是ToString()
不允許在select語句內部嗎?我通過運行原始查詢來獲得它,然後通過手動將匿名類型映射到EntityInfo
實例來創建新的枚舉,但我顯然更喜歡以前的版本。
僅供參考,我使用的是NHibernate.Linq 1.0.0.4000,NHibernate 2.1.0.4000和FluentNHibernate 1.0.0.593。
我最終採取了這種方法。但是,因爲它只是一個DTO,所以公共屬性都是重要的,我想將公共類型的ID保留爲String。所以我就繼續向EntityInfo提供一個公共構造函數,它接受一個ID爲int的值並執行相應的轉換。 – Dathan 2010-03-01 16:05:22