C# ArgumentOutOfRangeException在LINQ到NHibernate查询中使用ToString

C# ArgumentOutOfRangeException在LINQ到NHibernate查询中使用ToString,c#,nhibernate,linq-to-nhibernate,C#,Nhibernate,Linq To Nhibernate,我有一个基本的NHibernate.Linq查询: var items = from item in session.Linq<ObjectType>() where item.ID > 0 select new { ID = item.ID, Type = item.ClassName }; 我想返回一个IEnumerable: 从session.Linq()中的项返回 选择new EntityInfo(){ID=item

我有一个基本的NHibernate.Linq查询:

var items = from item in session.Linq<ObjectType>()
             where item.ID > 0
             select new { ID = item.ID, Type = item.ClassName };
我想返回一个
IEnumerable

从session.Linq()中的项返回
选择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() System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。 参数名称:索引 在System.ThrowHelper.ThrowarGumentofrangeException处(ExceptionArgument参数,ExceptionResource资源) 在System.ThrowHelper.throwargumentotofrangeexception()中 在System.SZArrayHelper.get_项[T](Int32索引) 位于System.Collections.ObjectModel.ReadOnlyCollection`1.get_项(Int32索引) 在NHibernate.Linq.Visitors.SelectArgumentsVisitor.VisitMethodCall(MethodCallExpression expr)中 在NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression) 在NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式exp) 在NHibernate.Linq.Visitors.ExpressionVisitor.VisitList(只读集合'1原件) 在NHibernate.Linq.Visitors.ExpressionVisitor.VisitNew(NewExpression nex) 在NHibernate.Linq.Visitors.SelectArgumentsVisitor.VisitNew(NewExpression) 在NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression) 在NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式exp) 在NHibernate.Linq.Visitors.RootVisitor.HandleSelectCall(MethodCallExpression调用)中 在NHibernate.Linq.Visitors.RootVisitor.VisitMethodCall(MethodCallExpression表达式)中 在NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression) 在NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式exp) 在NHibernate.Linq.Visitors.NHibernateQueryTranslator.Translate(表达式表达式,查询选项查询选项) 位于NHibernate.Linq.NHibernateQueryProvider.TranslateExpression(表达式表达式) 在NHibernate.Linq.NHibernateQueryProvider.Execute(表达式) 在NHibernate.Linq.Query`1.GetEnumerator()处 select语句中是否不允许
ToString()
?我通过运行原始查询,然后通过手动将匿名类型映射到
EntityInfo
实例来创建一个新的可枚举项,解决了这个问题,但我显然更喜欢以前的版本


作为参考,我使用的是NHibernate.Linq 1.0.0.4000、NHibernate 2.1.0.4000和FluentNHibernate 1.0.0.593。

您的意思是使用对象初始值设定项而不是数组初始值设定项吗

return from item in session.Linq<ObjectType>()
   select new EntityInfo() { ID = item.ID.ToString(), Type = item.ClassName };
从session.Linq()中的项返回
选择new EntityInfo(){ID=item.ID.ToString(),Type=item.ClassName};

我对
.ToString()
也有同样的问题,在LINQ to NHibernate查询中似乎不允许这样做。我的工作不仅仅是比较数值。对于您的问题,我建议使用以下类和查询:

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

从session.Linq()中的项返回
选择new EntityInfo(){item.ID,item.ClassName};

你完全正确。我将相应地编辑这个问题。我最终几乎采用了这种方法。但是,因为它只是一个DTO,所以公共属性才是最重要的,我希望将ID的公共类型保留为字符串。所以我就继续给EntityInfo一个公共构造函数,它接受一个int作为ID并执行适当的转换。
return from item in session.Linq<ObjectType>()
   select new EntityInfo() { ID = item.ID.ToString(), Type = item.ClassName };
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 };