0

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

4

2 回答 2

1

您的意思是使用对象初始化程序,而不是数组初始化程序吗?

return from item in session.Linq<ObjectType>()
   select new EntityInfo() { ID = item.ID.ToString(), Type = item.ClassName };
于 2010-02-26T22:39:08.940 回答
0

我有同样的问题.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; }
}

return from item in session.Linq<ObjectType>()
       select new EntityInfo() { item.ID, item.ClassName };
于 2010-02-27T05:43:07.443 回答