2010-02-26 110 views
0

我有一個基本的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。

回答

0

我有同樣的問題.ToString(),現在看來,這是不是在LINQ到NHibernate的查詢允許的。我的解決方法不僅僅是比較數值。對於你的問題,我建議使用下面的類和查詢:

public class EntityInfo 
{ 
private String _id;  
public int ID { 
get {return _id.ToString();} 
set {_id = Convert.ToInt32(value);}; 
} 
    public String Type { get; set; } 
} 

return from item in session.Linq<ObjectType>() 
     select new EntityInfo() { item.ID, item.ClassName }; 
+0

我最終採取了這種方法。但是,因爲它只是一個DTO,所以公共屬性都是重要的,我想將公共類型的ID保留爲String。所以我就繼續向EntityInfo提供一個公共構造函數,它接受一個I​​D爲int的值並執行相應的轉換。 – Dathan 2010-03-01 16:05:22

1

你的意思是使用對象初始值設定項而不是數組初始值設定項嗎?

return from item in session.Linq<ObjectType>() 
    select new EntityInfo() { ID = item.ID.ToString(), Type = item.ClassName }; 
+0

你是絕對正確的。我會相應地編輯問題。 – Dathan 2010-03-01 16:01:16