2017-07-28 4 views
2

J'étais curieux sur un modèle de réutilisation qui était peut-être possible et je voulais voir si d'autres l'avaient essayé. Essentiellement, j'ai par exemple ces EF standards 6.1.3 retours:Pouvez-vous placer un Func <EFContext, TResult> dans un Contexte d'Entités pour le réutiliser?

private IEnumerable<TypeTran> GetTypes() 
{ 
    using (var context = new ExpensesEntities()) 
    { 
    return context.tdType.Select(x => new TypeTran(x.TypeID, x.Description)).Where(x => x.TypeId != 3); 
    } 
} 

private List<Category> GetCurrentCategories() 
{ 
    using (var context = new ExpensesEntities()) 
    { 
    return context.tdCategory.Select(x => new Category(x.CategoryID, x.Description)).ToList(); 
    } 
} 

Ne vous inquiétez pas vraiment de TypeTran ou de la catégorie. Autant dire qu'ils ne sont que des POCO et pourraient être n'importe quoi. Ils ne font qu'abstraire une suppression de couche de EF afin que je puisse avoir plus d'effets après-vente sur un objet Modèle sans affecter les objets générés par T4 à partir de la base de données. Ce modèle fonctionne très bien, mais il y a beaucoup plus de modèles de récupération donc j'étais curieux de savoir si je pouvais faire quelque chose comme:

private TReturn RunContextWithOption<TReturn>(Func<ExpensesEntities, TReturn> func) 
{ 
    using (var context = new ExpensesEntities()) 
    { 
    return func.Invoke(context); 
    } 
} 

Mais lorsque je tente de l'exécuter que je fais la syntaxe mal et je suis aussi ne pas voir une manière d'utiliser le contexte sans le pré-définir.

//Wrong won't run 
private List<TypeTran> GetTypes() 
{ 
    var cont = new ExpensesEntities(); 
    return RunContextWithOption<List<TypeTran>>((cont) => cont.tdType.Select(x => new TypeTran(x.TypeID, x.Description)).Where(x => x.TypeId != 3)); 

} 

Ainsi, il devient le poulet ou l'oeuf, je veux le contexte d'être invoqué auto avec une aide, mais je ne peux pas que je besoin que dans un arg il apparaît. Est-ce que quelqu'un d'autre a essayé quelque chose de similaire pour rendre leur modèle de repo simplement moins de lignes de code? Cela peut être une mauvaise pratique mais je suis généralement pour moins de lignes de code et en utilisant des aides privées autant que possible plutôt que de répéter en utilisant (var contexte ...) ad infinitum.

+0

Vous voulez une méthode générique pour revenir une liste d'entités de type inconnu en transmettant une clause filter/where? – DavidG

+0

Trier par. Dans mon espoir, je pourrais avoir la fonction dire l'objet de contexte comme tdType, teCategory, etc ... Le keep devenant la fonction est acceptée mais mon utilisation est toujours contrecarrée par des choses comme: "Vous ne pouvez pas convertir ceci en ceci". Essentiellement c'est pour un tas de retours 'GetAll' où la seule variable est le type et le type. Parfois, ils peuvent avoir une clause Where, mais pas toujours. – djangojazz

+0

Qu'entendez-vous par "objet généré par l'entité"? Ce n'est pas clair. – DavidG

Répondre

1

Fondamentalement, c'est ce dont vous avez besoin. J'ai inclus une clause Where facultative et il serait assez trivial d'inclure, par exemple, un OrderBy aussi:

public IEnumerable<TEntity> GetEntities<TEntity>(
    Expression<Func<TEntity, bool>> predicate = null) 
    where TEntity : class 
{ 
    using (var context = new ExpensesEntities()) 
    { 
     IQueryable<TEntity> data = context.Set<TEntity>(); 
     if (predicate != null) 
     { 
      data = data.Where(predicate); 
     } 

     return data.ToList(); 
    } 
} 

Et l'appeler comme ceci:

var diedOn = DateTime.Now.AddDays(-30); 
var zombiesOlderThan30Days = GetEntities<Zombie>(z => 
    z.Name == "Bob" && z.DiedOn > diedOn); 

var allZombies = GetnEntities<Zombie>(); 
+0

Merci qui ressemble presque exactement à ce que je voulais, mais je reçois une erreur sur la ligne de 'context.Set '. Il indique: 'Erreur \t CS0452 \t Le type' TEntity 'doit être un type de référence pour pouvoir l'utiliser comme paramètre' TEntity 'dans le type ou la méthode générique' DbContext.Set () ''. Vous ne savez pas si vous utilisez votre contexte EF d'une manière différente. Je sais que j'ai mis à jour à partir d'EF 4 à l'origine sur ce sujet et le contexte est défini comme 'ExpensesEntities: DbContext' et a des membres comme 'public virtuel DbSet tdCategory {get; set;} ... – djangojazz

+0

Oups, tapé sans confirmer qu'il compile, essayez à nouveau! – DavidG

+0

Même erreur, je dois partir pour la plus grande partie de la journée mais je reviendrai sur le week-end pour vérifier et voir où il se trouve. Merci pour l'aide jusqu'à présent. Désolé si cela semblait un peu vague ce que j'essayais de faire. Vous avez l'air d'en avoir le flacon maintenant. – djangojazz