我有一个基本的 NHibernate.Linq 查询:
var items = from item in session.Linq<ObjectType>()
where item.ID > 0
select new { ID = item.ID, Type = item.ClassName };
这工作正常。但是,ObjectType 是一个重量级的类,我只想要 ID 和 ClassName。所以我创建了一个名为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 :索引超出范围。必须是非负数且小于集合的大小。 参数名称:索引 在 System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument 参数,ExceptionResource 资源) 在 System.ThrowHelper.ThrowArgumentOutOfRangeException() 在 System.SZArrayHelper.get_Item[T](Int32 索引) 在 System.Collections.ObjectModel.ReadOnlyCollection`1.get_Item(Int32 索引) 在 NHibernate.Linq.Visitors.SelectArgumentsVisitor.VisitMethodCall(MethodCallExpression expr) 在 NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) 在 NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式 exp) 在 NHibernate.Linq.Visitors.ExpressionVisitor.VisitList(ReadOnlyCollection`1 original) 在 NHibernate.Linq.Visitors.ExpressionVisitor.VisitNew(NewExpression nex) 在 NHibernate.Linq.Visitors.SelectArgumentsVisitor.VisitNew(NewExpression expr) 在 NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) 在 NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式 exp) 在 NHibernate.Linq.Visitors.RootVisitor.HandleSelectCall(MethodCallExpression 调用) 在 NHibernate.Linq.Visitors.RootVisitor.VisitMethodCall(MethodCallExpression expr) 在 NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) 在 NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(表达式 exp) 在 NHibernate.Linq.Visitors.NHibernateQueryTranslator.Translate(表达式表达式,QueryOptions 查询选项) 在 NHibernate.Linq.NHibernateQueryProvider.TranslateExpression(表达式表达式) 在 NHibernate.Linq.NHibernateQueryProvider.Execute(表达式表达式) 在 NHibernate.Linq.Query`1.GetEnumerator()
是ToString()
不是里面的select语句是不允许的?我已经通过运行原始查询来解决它,然后通过手动将匿名类型映射到EntityInfo
实例来创建一个新的枚举,但我显然更喜欢以前的版本。
作为参考,我使用的是 NHibernate.Linq 1.0.0.4000、NHibernate 2.1.0.4000 和 FluentNHibernate 1.0.0.593。