Impossible de trouver une implémentation du modèle de requête

102

Dans mon application silverlight, j'essaie de créer une connexion à une base de données en utilisant LINQ. Tout d'abord, j'ajoute une nouvelle classe LINQ to SQL, et y glisse ma table appelée "tblPersoon".

Ensuite, dans mon fichier de service, j'essaye d'exécuter la requête suivante:

[OperationContract]
public tblPersoon GetPersoonByID(string id)
{
    var query = (from p in tblPersoon where p.id == id select p).Single();

Mais chez tblPersoon, cela me donne l'erreur suivante.

Impossible de trouver une implémentation du modèle de requête pour le type de source «SilverlightApplication1.Web.tblPersoon». «Où» introuvable.

Et même quand j'essaye ce qui suit:

var query = (from p in tblPersoon select p).Single();

Cela me donne une erreur disant «Sélectionner» introuvable!

Le code de la classe générée pour ma table peut être trouvé ici: http://pastebin.com/edx3XRhi

Qu'est-ce qui cause cela et comment pourrais-je résoudre ce problème?

Je vous remercie.

Schoof
la source

Réponses:

255

Est la tblPersoonmise en œuvre IEnumerable<T>? Vous devrez peut-être le faire en utilisant:

var query = (from p in tblPersoon.Cast<Person>() select p).Single();

Ce type d'erreur ( impossible de trouver une implémentation du modèle de requête ) se produit généralement lorsque:

  • Il vous manque l'utilisation de l'espace de noms LINQ ( using System.Linq)
  • Le type que vous interrogez n'est pas implémenté IEnumerable<T>

Modifier :

Outre le fait que vous interrogez le type ( tblPersoon) au lieu de la propriété tblPersoons, vous avez également besoin d'une instance de contexte (classe qui définit la tblPersoonspropriété), comme ceci:

public tblPersoon GetPersoonByID(string id)
{
    var context = new DataClasses1DataContext();
    var query = context.tblPersoons.Where(p => p.id == id).Single();
    // ...
km
la source
My DataClasses1.Desinger.cs (code généré automatiquement par LINQ) n'inclut pas IEnumerable <T>. public System.Data.Linq.Table<tblPersoon> tblPersoons { get { return this.GetTable<tblPersoon>(); } } Et quand j'utilise: var query = (from p in tblPersoon.Cast <Person> () select p) .Single (); Cela me donne les erreurs suivantes sur .Cast. 'SilverlightApplication1.Web.tblPersoon' ne contient pas de définition pour 'Cast'
Schoof
1
@ThomasSchoof: cela pourrait-il être une faute de frappe? La propriété est appelée tblPersoons(notez le s à la fin) tandis que le type est tblPersoon. Vous interrogez le type, au lieu de la propriété sur le type.
km
Si j'essaye, var query = (from p in tblPersoons select p).Single();cela me dit que tblPersoons n'existe même pas.
Schoof
1
Je ne pense pas que LINQ to SQL était destiné à mettre à jour la base de données (d'où la requête dans Language INtegrated Query), mais vous pouvez trouver de l'aide sur ces sujets sur la page LINQ to SQL MSDN ( section Mise à jour sans requête ).
km
27
L'ajout en utilisant System.Linq l'a fait pour moi .. :)
Guruprasad Rao
179

Vous devrez peut-être ajouter une usingdéclaration au fichier. Le modèle de classe Silverlight par défaut ne l'inclut pas:

using System.Linq;
Bryan Watts
la source
Merci pour la réponse, mais l'instruction using était déjà là.
Schoof
1
Merci pour la réponse ... cela a corrigé mon problème !!! mais ... y a-t-il une explication supplémentaire que vous pouvez fournir?
Joe
Impressionnant!! Merci
piranha bleu
exaspérant. Je vous remercie.
Barry
30

Assurez-vous que ces références sont incluses:

  • System.Data.Linq
  • System.Data.Entity

Ajoutez ensuite l'instruction using

using System.Linq;
MobileMon
la source
1
Merci beaucoup
Mohammed Z. Aljezawi
7

J'ai eu un problème similaire avec des ensembles de données générés fortement typés, le message d'erreur complet était:

Impossible de trouver une implémentation du modèle de requête pour le type de source «MyApp.InvcHeadDataTable». «Où» introuvable. Pensez à spécifier explicitement le type de la variable de plage «ligne».

De mon code:

        var x =
            from row in ds.InvcHead
            where row.Company == Session.CompanyID
            select row;

J'ai donc fait ce qu'il suggérait et spécifié explicitement le type:

        var x =
            from MyApp.InvcHeadRow row in ds.InvcHead
            where row.Company == Session.CompanyID
            select row;

Ce qui a fonctionné un régal.

Stephen Turner
la source
5

Il vous manque une égalité:

var query = (from p in tblPersoon where p.id == 5 select p).Single();

where clause doit aboutir à un booléen.

OU vous ne devriez pas utiliser wheredu tout:

var query = (from p in tblPersoon select p).Single();
Adriano Carneiro
la source
Merci, je manquais en effet mon égalité, ce qui était stupide de ma part. Mais j'obtiens maintenant l'erreur suivante: Erreur 1 Impossible de trouver une implémentation du modèle de requête pour le type de source «SilverlightApplication1.Web.tblPersoon». «Où» introuvable.
Schoof
0

J'ai eu la même erreur que celle décrite par le titre, mais pour moi, il s'agissait simplement d'installer Microsoft Access 12.0 oledb redistribuable à utiliser avec LinqToExcel.

BanMe
la source
0

Salut, la façon la plus simple de le faire est de convertir ce IEnumerable en un Queryable

S'il s'agit d'un interrogeable, il devient alors facile d'effectuer des requêtes.

Veuillez vérifier ce code:

var result = (from s in _ctx.ScannedDatas.AsQueryable()
                              where s.Data == scanData
                              select s.Id).FirstOrDefault();
                return "Match Found";

Assurez-vous d'inclure System.Linq . De cette façon, votre erreur sera résolue.

Abhay Shiro
la source
0

Pour ceux d'entre vous (comme moi) qui ont perdu trop de temps à cause de cette erreur:

J'avais reçu la même erreur: "Impossible de trouver l'implémentation du modèle de requête pour le type de source 'DbSet'" mais la solution pour moi était de corriger une erreur au niveau de DbContext.

Quand j'ai créé mon contexte, j'avais ceci:

public class ContactContext : DbContext
    {
        public ContactContext() : base() { }

        public DbSet Contacts { get; set; }
    }

Et mon référentiel (je suivais un modèle de référentiel dans le guide ASP.NET) ressemblait à ceci:

public Contact FindById(int id)
    {       
        var contact = from c in _db.Contacts where c.Id == id select c;
        return contact;
    }

Mon problème est venu de la configuration initiale de mon DbContext, lorsque j'ai utilisé DbSet comme générique au lieu du type.

J'ai changé public DbSet Contacts { get; set; }à public DbSet<Contact> Contacts { get; set; }et tout à coup la requête a été reconnu.


C'est probablement ce que dit km dans sa réponse, mais comme il l'a mentionné IEnumerable<t>et non, DbSet<<YourDomainObject>>j'ai dû fouiller dans le code pendant quelques heures pour trouver la ligne qui avait causé ce mal de tête.

TylerSmall19
la source
0

J'ai eu la même erreur, mais pour moi, elle était attribuée au fait d'avoir une base de données et une table qui portaient le même nom. Lorsque j'ai ajouté l'objet d'entité ADO .NET à mon projet, il a mal généré ce que je voulais dans mon fichier de contexte de base de données:

// Table
public virtual DbSet<OBJ> OBJs { get; set; }

qui aurait dû être:

public virtual DbSet<OBJ> OBJ { get; set; }

Et

// Database?
public object OBJ { get; internal set; }

dont je n'avais pas vraiment besoin, alors je l'ai commenté.

J'essayais de tirer ma table comme ça, dans mon contrôleur, quand j'ai eu mon erreur:

protected Model1 db = new Model1();

public ActionResult Index()
{
    var obj =
        from p in db.OBJ
        orderby p.OBJ_ID descending
        select p;

    return View(obj);
}

J'ai corrigé le contexte de ma base de données et tout allait bien, après cela.

vapcguy
la source