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:と呼ばれる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を使用しています。

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 に答える