2009-03-12 6 views
5

は、LINQは、それが作業しているオブジェクトのか分からないので、i.Idがコンテキスト内に存在しない、とIdがあることを、こののLINQ 2 SQL - ジェネリック句

public T GetItemById(int id) 
{ 
    Table<T> table = _db.GetTable<T>(); 
    table.Where(t => t.Id == id); 
} 

注を行うにはそこの方法ですテーブルの主キー

答えて

0
var X = _db.table.Select(i => i.Id == id); 

これはIQueryableを< T>

+0

をしかし_db.tableがジェネリックであるとして(i.Id)は現在のコンテキスト内に存在しない:) –

+0

あなたは手の込んだことができますあなたの方法の使用法について? –

+0

これについて忘れてください...ジョン・スケートはここにあります:) –

4

(属性にバインド取り除かアプローチ)

編集を返します。そして、ここでのメタモデルの道を(それが帰属するオブジェクトだけでなく、マッピングファイルで動作します):

static TEntity Get<TEntity>(this DataContext ctx, int key) where TEntity : class 
{ 
    return Get<TEntity, int>(ctx, key); 
} 
static TEntity Get<TEntity, TKey>(this DataContext ctx, TKey key) where TEntity : class 
{ 
    var table = ctx.GetTable<TEntity>(); 
    var pkProp = (from member in ctx.Mapping.GetMetaType(typeof(TEntity)).DataMembers 
        where member.IsPrimaryKey 
        select member.Member).Single(); 
    ParameterExpression param = Expression.Parameter(typeof(TEntity), "x"); 
    MemberExpression memberExp; 
    switch (pkProp.MemberType) 
    { 
     case MemberTypes.Field: memberExp = Expression.Field(param, (FieldInfo)pkProp); break; 
     case MemberTypes.Property: memberExp = Expression.Property(param, (PropertyInfo)pkProp); break; 
     default: throw new NotSupportedException("Invalid primary key member: " + pkProp.Name); 
    } 
    Expression body = Expression.Equal(
     memberExp, Expression.Constant(key, typeof(TKey))); 
    var predicate = Expression.Lambda<Func<TEntity, bool>>(body, param); 
    return table.Single(predicate); 
} 
+0

マーク、私はあなたを愛しています。 –

2

エンティティが派生する適切なインターフェイスを作成する必要があります(ただし、式tr )マークの例のようにEE:

public interface IIdentifiedEntity 
{ 
    int Id { get; } // Set as well? Depends on your situation. 
} 

次にあなたが書くことができます:はい

public T GetItemById<T>(int id) where T : class, IIdentifiedEntity 
{ 
    Table<T> table = _db.GetTable<T>(); 
    return table.Where(t => t.Id == id) 
       .Single(); 
} 
+0

uhmこれはクラスpublicクラスのRepositoryBaseであることに注意してください。RepositoryBase T:cla –

+0

このアプローチの問題点は、暗黙のインターフェイス実装の場合のみです... –

+0

(すなわち、IIdentifiedEntity.IdマップをFooに持つことはできません。 FooID) –