0

Comment puis-je obtenir quelque chose comme ce qui suit?Référentiel générique MVC C# avec nom de colonne personnalisé

public interface IGenericRepository 
{ 
    int id { get; } 

    T GetById<T>() where T : class 
} 

public class GenericRepository : IGenericRepository 
{ 
    //Some code here 

    public T GetById<T>(int tid) where T : class 
    { 
     return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl; 
    } 
} 

Et je voudrais l'utiliser comme suit:

GenericRepository gr = new GenericRepository(); 
Category cat = gr.GetById<Category>(15); 

Bien sûr, dans cet usage, tbl.id dans le GenericRepository me donne une erreur.

SOLUTION

public class IHasId 
{ 
    public int id { get; set; } 
} 

public interface IGenericRepository 
{ 
    int id { get; } 

    T GetById<T>(int id) where T : IHasId; 
} 

public class GenericRepository : IGenericRepository 
{ 
    public int id 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public T GetById<T>(int id) where T : IHasId 
    { 
     return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl; 
    } 
} 

Et en dehors de ceux-ci, ne pas oublier de définir cela quelque part dans votre modèle:

public partial class Category : IHasId { } 

Et l'utilisation est:

Repository rep = new Repository(); 
Category cat = rep.GetById<Category>(15); 

Répondre

1
public class IHasId 
{ 
    public int id { get; set; } 
} 

public interface IGenericRepository<T> 
{ 
    int id { get; } 

    T GetById(int id); 
} 

public class GenericRepository<T> : IGenericRepository<T> where T : IHasId 
{ 
    public int id 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public T GetById(int id) 
    { 
     return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl; 
    } 
} 
+0

Damn !! J'ai finalement compris le problème, mis à part ces codes, j'ai dû créer une classe partielle pour chaque entité que j'utilise. Dites, j'ai une table Catégorie, j'ai dû créer une Catégorie partielle publique avec l'héritage IBase !! Merci mec!! – Shaokan

+1

héritage IHasId désolé :) – Shaokan

1

Vous obtenez cette erreur parce que vous acceptez toutes les classes where T : class. Une classe n'a pas cette propriété.

Créez une classe ou une interface abstraite pour vous assurer que cette propriété existe et modifiez where T : class à where T : IHasIdProperty.

+0

Mais quand j'utilise gr.GetById (15), il me donne une erreur qui dit qu'il est impossible de convertir catégorie à IhasIdProperty, @dknaack – Shaokan

+0

En fait, @dknaack, quand je change la clause where où T: IHasID, puis le dataContext.GetTable me donnera une erreur – Shaokan

+0

theres une nouvelle réponse avec un référentiel changé. – dknaack

2

Il y a quelques problèmes ici - le premier est que le type générique que vous correspondez est une classe, mais une classe n'a pas de propriété appelée 'id'. Vous devez avoir votre catégorie classe implémente une interface qui expose un « id » propriété:

public interface IIdentity 
{ 
    int identity { get; set; } 
} 

public class Category : IIdentity 
{ 
    public int identity{ get; set; } 
} 

Je ne sais pas pourquoi vous avez exposé « id » comme une propriété sur l'interface IGenericRepository - sûrement ce qui est censé être un paramètre passé à la méthode find (comme indiqué par votre implémentation). Vous devez également modifier la restriction de la méthode « GetById » de:

where T : class 

à quelque chose comme

where T : IIdentity 

en utilisant l'interface que je l'ai suggéré plus haut.

+0

merci pour votre réponse @Dave. Mais le problème est que quand je change où T: class à IIdentity, dataContext.GetTable ne fonctionnera pas puisque T fonctionne comme une variable de noms de table dans ce contexte. Ou je ne peux pas obtenir ce travail, je ne sais pas ... – Shaokan

+0

Quel message d'erreur obtenez-vous? – Dave

+0

Ok, j'ai résolu le problème, je vais modifier ma question :) – Shaokan

Questions connexes