2009-03-12 18 views
5

¿Hay una manera de hacer estoLinq 2 SQL - Genérico cláusula where

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

Tenga en cuenta que i.Id no existe en el contexto como LINQ no sabe qué objeto se está trabajando, y es Id la clave principal de la tabla

Respuesta

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

esto devolverá IQueryable < T>

+0

Sí, pero (i.Id) no existe en el contexto actual como _db.table es genérica :) –

+0

puede dar más detalles en el uso de tu método? –

+0

olvídalo ... Jon Skeet está aquí :) –

4

(enfoque eliminado con destino a los atributos)

edit: y aquí está la forma de meta-modelo (por lo que funciona con archivos de asignación, así como objetos atribuidos):

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

Marc, te amo. –

2

se necesitaría para crear una interfaz apropiada que las entidades se derivan de (a menos que desee hacerlo con un tr expresión ee como ejemplo de Marc):

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

A continuación, se puede escribir:

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 tenga en cuenta que se trata de una clase pública clase RepositoryBase donde T: cla –

+0

El problema con este enfoque es que solo funciona para implementaciones de interfaz implícita ... –

+0

(es decir, no puede tener el mapa IIdentifiedEntity.Id a Foo. FooID) –