C# ArgumentOutOfRangeException在LINQ到NHibernate查询中使用ToString
我有一个基本的NHibernate.Linq查询: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
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 };