2011-07-06 14 views
3

Linq2SQLを使用してエンティティのコレクションをロードしようとしています。問題は、私はエンティティが何であるか知りません、IList<object>です。私はリフレクションを使用してそれらを選択しようとしましたが、selectを実行するときにメモリ不足のエラーが発生します。コンテキストが自分の式を解析できず、DBからすべてをロードしているためです。Linq2SQL - 反射を使用して項目を選択する

誰かがこれについての助言をしている場合、または私が欲しいことを行うための代替方法があれば教えてください。

foreach (object entity in requiredEntities) 
{ 
    Type entityType = entity.GetType(); 
    IQueryable<object> entityTable = (IQueryable<object>)dataContext.GetTable(entityType);    

    // grab the objects primary key field 
    var pkeyField = entityType.GetProperties().SingleOrDefault(p => 
        p.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute),true) 
        .Cast<System.Data.Linq.Mapping.ColumnAttribute>() 
        .Any(attrib => attrib.IsPrimaryKey)); 

    object pkeyValue = pkeyField.GetValue(entity,null); 

    Func<object,bool> primaryKeySelector = o => pkeyField.GetValue(o,null) == pkeyValue; 

    // crash here, out of memory exception 
    object result = entityTable.Where(primaryKeySelector).SingleOrDefault(); 
} 
+0

var entityType = typeof(User); var metaType = dataContext.Mapping.GetMetaType(entityType); var member = metaType.DataMembers.Single(m => m.IsPrimaryKey).Member; var param = Expression.Parameter(entityType); var body = Expression.Equal(Expression.MakeMemberAccess(param, member), Expression.MakeMemberAccess(Expression.Constant(entity), member)); dynamic table = dataContext.GetTable(entityType); object result = Cheeky(table, body, param); 

、可能な – jasper

+0

はの 'requiredEntities'の集合である場合、私は、動的LINQを避けたいのですが単一のタイプ? –

+0

いいえ、複数のタイプ – jasper

答えて

4

デリゲートを使用すると、強制的にLINQ-to-Objectsを使用するため、メモリが不足しています。あなたがする必要があるのはExpressionです。同様に、LINQ-to-SQLがサポートする唯一のモデルではないので、属性を使用することは悪い習慣です。主キーを取得するには、dataContext.Mapping.GetMetaType(entityType)を参照することをお勧めします。

あなたは4.0を持っている場合は、次のように動作するはずです:ああ

static T Cheeky<T>(ITable<T> source, Expression body, ParameterExpression param) 
    where T : class 
{ 
    var predicate = Expression.Lambda<Func<T, bool>>(body, param); 
    return source.SingleOrDefault(predicate); 
} 
+0

パーフェクト、ありがとう。そのような一般的なメソッドに動的な型を渡すことはできませんでした。 – jasper

+0

@ジャスパー実際には、私は '動的'のために持っているいくつかの使い方の1つです;私のコードは静的型が好きですが、 'MakeGenericMethod' /' MakeGenericType'などはPITAです - レスキュー用の 'dynamic'; p –

関連する問題