web-dev-qa-db-fra.com

Impossible de trouver une implémentation du motif de requête

Dans mon application silverlight, j'essaie de créer une connexion à une base de données à l'aide de 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'essaie 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 à tblPersoon cela me donne l'erreur suivante.

Impossible de trouver une implémentation du motif de requête pour le type de source 'SilverlightApplication1.Web.tblPersoon'. "Où" pas trouvé.

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

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

Cela me donne une erreur en disant 'Select' not found!

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 le résoudre?

Je vous remercie.

68
Schoof

Est-ce que tblPersoon implémente 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 motif 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'implémente pas 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 propriété tblPersoons), comme ceci: 

public tblPersoon GetPersoonByID(string id)
{
    var context = new DataClasses1DataContext();
    var query = context.tblPersoons.Where(p => p.id == id).Single();
    // ...
185
k.m

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

using System.Linq;
129
Bryan Watts

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

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

Ajoutez ensuite l'instruction using

using System.Linq;
18
MobileMon

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

Impossible de trouver une implémentation du modèle de requête pour type de source 'MyApp.InvcHeadDataTable'. "Où" pas trouvé. Envisagez explicitement de spécifier 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 qui est suggéré et explicitement spécifié 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.

6
Stephen Turner

Il vous manque une égalité:

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

La clause where doit donner un booléen.

OU vous ne devriez pas utiliser where du tout:

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

Salut le moyen le plus simple de faire cela est de convertir cet IEnumerable en un Queryable

Si c'est un objet interrogeable, alors effectuer des requêtes devient facile.

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.

0
Abhay Shiro

J'ai eu la même erreur, mais pour moi, cela a été attribué à avoir une base de données et une table qui portent 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 le fichier de contexte de ma 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; }

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

J'essayais de tirer dans 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.

0
vapcguy

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

0
BanMe

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

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

Lorsque 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, quand j'ai utilisé DbSet comme un générique au lieu du type.

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


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

0
TylerSmall19