Je cherche un équivalent du est là. Un moyen d'obtenir un objet iquérir pour une table à l'aide du type d'entité sans spécifier le querystring? p> Cela fonctionne tant que le nom de la classe est identique au nom de la table. Cela deviendra un problème pour moi lorsque je vais commencer à utiliser différents objets pour la même table. P> J'espère que j'ai été clair, merci d'avance, dataContext.getable objetContext.creequery dataContext.getable * Edition: Ajout du code SNIPPET * CODE>
Ceci est un extrait d'une classe de référentiel que j'ai mis en œuvre qui fonctionne avec LINQ2SQL. Je ne peux pas utiliser objetContext. [Nom du nom] code> car il ne serait plus générique. P> * Modifier: Ajouté ma solution (jusqu'à présent ..) * code>
C'est ce que j'utilise: p>
Marco:) P> P>
3 Réponses :
J'espère que je ne manque pas de point, mais ce ne serait-il pas: où le nom de la table est l'entité du type que vous souhaitez utiliser. P> < / p>
Bonjour, je ne veux pas utiliser le nom de la table car je veux avoir une manière générique d'accéder à la table. J'ai ajouté un extrait de code de ma classe pour mieux expliquer ce que j'aimerais réaliser. La seule solution que je puisse imaginer maintenant est d'utiliser l'objetContext.Createequyerer
En réalité, le concepteur EF utilise lui-même techniquement, il n'y a pas de solution parfaite car vous pouvez utiliser le même type d'entité pour différents ensembles d'entités. Mais vous pouvez lui donner l'ancien collège Essayez: P> Crééquéry code> avec des chaînes codées dur pour les références statiques. Si vous creusez dans le fichier de concepteur, vous verrez quelque chose comme ceci: public IQueryable<TEntity> GetEntities<TEntity>()
{
Type t = typeof(TEntity);
var edmAttr = (EdmEntityTypeAttribute)Attribute.GetCustomAttribute(t,
typeof(EdmEntityTypeAttribute), false);
if (edmAttr == null) // Fall back to the naive way
{
return context.CreateQuery<TEntity>(t.Name);
}
var ec = context.MetadataWorkspace.GetEntityContainer(
context.DefaultContainerName, DataSpace.CSpace);
var entityType = context.MetadataWorkspace.GetType(edmAttr.Name,
edmAttr.NamespaceName, DataSpace.CSpace);
var es = ec.BaseEntitySets.First(es => es.ElementType == entityType);
return context.CreateQuery<TEntity>(es.Name);
}
Merci cela fonctionne bien! Par hasard, j'ai trouvé une solution similaire dans le projet KIGG sur CodePlex ( KIGG.CODEPLEX.COM ).
Essayer d'utiliser ce code, mais le problème est que Baseentitysetsets.First n'est pas iquérissable, alors je ne vois donc pas comment d'autres ont obtenu cet exemple de travail.
Je pense que cette question doit être mise à jour. Il semble que la personne qui pose la question ait accepté une réponse qu'il utilise uniquement une partie. La réponse est confuse. En réalité, le questionneur n'utilise que le contexte de retour .Createequy
@James: une ligne de code oubliée. Vous avez juste besoin de créer une requête avec le nom code> à partir du entitysetbase code>. Je doute que l'OP ne colle qu'avec la solution naïve d'utiliser le nom de type - qui se brisera avec n'importe quelle personnalisation. Déjà détendez-moi, je sais que c'est frustrant d'essayer de mettre en œuvre une réponse avec une erreur, mais cela ne signifie pas que tout le reste est faux faux.
@AarNaught: N'ayait certainement pas dit que c'était faux, c'est-à-dire que comme la réponse acceptée, elle n'a pas fonctionné et n'était pas en réalité ce que le questionneur signifiait. Merci pour la mise à jour!
@Aronner: En fait, si vous avez le temps d'aimer si vous pouviez mettre à jour votre réponse un peu. Je ne comprends même pas bien la différence dans les 2 créatures. Peut-être parce que la mienne ne frappe jamais le premier et je ne suis pas sûr de ce que le type d'objet ferait cela.
Trop de commentaires que je connais mais je pense que je l'obtiens maintenant. Si le type d'entité n'est pas le même nom de table? Signification "Customer_Object" vs. "Customer_Table" Oui? Donc, si nos noms d'entité sont toujours les mêmes que le nom de la table, tout ce dont nous avons vraiment besoin est la ligne de créativité?
@James: Droite. Vous pouvez donc voir comment cela ne sera pas toujours le cas, en particulier si vous pluralisez les noms de table (que je fais presque toujours).
public IQueryable GetTable<T>(T entity) where T : class
{
return context.CreateObjectSet<T>();
}
Marco B, avez-vous trouvé une solution? J'ai le même problème et je passe même "[Entityset]" en tant que paramètre de créature que je ne peux pas le faire fonctionner.
J'ai trouvé cette réponse en premier et Cette réponse après cela. Il semble que la deuxième réponse ait un moyen beaucoup plus facile de faire cela qui ressemble à
gettable code> à partir de LINQ2SQL