基本的な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
:と呼ばれるDTOを作成しました
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 index)で NHibernate.Linq.Visitors.SelectArgumentsVisitor.VisitMethodCall(MethodCallExpression expr)で NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)で NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(Expression 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(Expression exp)で NHibernate.Linq.Visitors.RootVisitor.HandleSelectCall(MethodCallExpression call)で NHibernate.Linq.Visitors.RootVisitor.VisitMethodCall(MethodCallExpression expr)で NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)で NHibernate.Linq.Visitors.NHibernateExpressionVisitor.Visit(Expression exp)で NHibernate.Linq.Visitors.NHibernateQueryTranslator.Translate(式、QueryOptions 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、およびFluentNHibernate1.0.0.593を使用しています。