Impossibile trovare un'implementazione del modello di query


103

Nella mia applicazione Silverlight sto cercando di creare una connessione al database utilizzando LINQ. Per prima cosa aggiungo una nuova classe LINQ to SQL e trascino la mia tabella chiamata "tblPersoon" al suo interno.

Quindi nel mio file di servizio cerco di eseguire la seguente query:

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

Ma a tblPersoon mi dà il seguente errore.

Impossibile trovare un'implementazione del modello di query per il tipo di origine "SilverlightApplication1.Web.tblPersoon". "Dove" non trovato.

E anche quando provo quanto segue:

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

Mi dà un errore che dice "Seleziona" non trovato!

Il codice per la classe generata per la mia tabella può essere trovato qui: http://pastebin.com/edx3XRhi

Qual è la causa e come potrei risolverlo?

Grazie.

Risposte:


255

L' tblPersoonimplementazione IEnumerable<T>? Potrebbe essere necessario farlo utilizzando:

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

Questo tipo di errore ( Impossibile trovare un'implementazione del modello di query ) si verifica in genere quando:

  • Manca l'utilizzo dello spazio dei nomi LINQ ( using System.Linq)
  • Il tipo che stai interrogando non implementa IEnumerable<T>

Modifica :

Oltre al fatto che si interroga type ( tblPersoon) invece di property tblPersoons, è necessaria anche un'istanza di contesto (classe che definisce la tblPersoonsproprietà), come questa:

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

My DataClasses1.Desinger.cs (codice LINQ generato automaticamente) non include IEnumerable <T>. public System.Data.Linq.Table<tblPersoon> tblPersoons { get { return this.GetTable<tblPersoon>(); } } E quando uso: var query = (da p in tblPersoon.Cast <Person> () select p) .Single (); Mi dà i seguenti errori su .Cast. "SilverlightApplication1.Web.tblPersoon" non contiene una definizione per "Cast"
Schoof

1
@ThomasSchoof: potrebbe essere un errore di battitura? La proprietà viene chiamata tblPersoons(nota la s alla fine) mentre il tipo è tblPersoon. Esegui query sul tipo, anziché sulla proprietà sul tipo.
km

Se provo var query = (from p in tblPersoons select p).Single();mi dice che tblPersoons non esiste nemmeno.
Schoof

1
Non penso che LINQ to SQL avesse lo scopo di aggiornare il database (quindi query in Language INtegrated Query), tuttavia puoi trovare aiuto con questi argomenti nella pagina LINQ to SQL MSDN ( sezione Aggiornamento senza query ).
km

28
L'aggiunta utilizzando System.Linq l'ha fatto per me .. :)
Guruprasad Rao

180

Potrebbe essere necessario aggiungere una usingdichiarazione al file. Il modello di classe Silverlight predefinito non lo include:

using System.Linq;

Grazie per la risposta, ma la dichiarazione using era già presente.
Schoof

1
Grazie per la risposta ... questo ha corretto il mio problema !!! ma ... c'è una spiegazione aggiuntiva che puoi fornire?
Joe

Eccezionale!! Grazie
piranha blu

esasperante. Grazie.
Barry,

30

Assicurati che questi riferimenti siano inclusi:

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

Quindi aggiungi l'istruzione using

using System.Linq;

1
Grazie mille
Mohammed Z. Aljezawi

7

Ho avuto un problema simile con i set di dati generati fortemente tipizzati, il messaggio di errore completo era:

Impossibile trovare un'implementazione del modello di query per il tipo di origine "MyApp.InvcHeadDataTable". "Dove" non trovato. Considera l'idea di specificare in modo esplicito il tipo di variabile di intervallo "riga".

Dal mio codice:

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

Quindi ho fatto come suggerito e specificato esplicitamente il tipo:

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

Che ha funzionato a meraviglia.


5

Ti manca un'uguaglianza:

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

where la clausola deve risultare in un booleano.

O non dovresti usare whereaffatto:

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

Grazie, mi mancava davvero la mia uguaglianza, il che è stato stupido da parte mia. Ma ora ricevo il seguente errore: Errore 1 Impossibile trovare un'implementazione del modello di query per il tipo di origine "SilverlightApplication1.Web.tblPersoon". "Dove" non trovato.
Schoof

0

Ho avuto lo stesso errore descritto dal titolo, ma per me è stato semplicemente l'installazione di Microsoft Access 12.0 ridistribuibile oledb da utilizzare con LinqToExcel.


0

Ciao, il modo più semplice per farlo è convertire questo IEnumerable in un Queryable

Se si tratta di un oggetto interrogabile, l'esecuzione di query diventa facile.

Si prega di controllare questo codice:

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

Assicurati di includere System.Linq . In questo modo il tuo errore verrà risolto.


0

Per quelli di voi (come me) che hanno perso troppo tempo per questo errore:

Avevo ricevuto lo stesso errore: "Impossibile trovare l'implementazione del pattern di query per il tipo di origine" DbSet "" ma la soluzione per me è stata la correzione di un errore a livello di DbContext.

Quando ho creato il mio contesto avevo questo:

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

        public DbSet Contacts { get; set; }
    }

E il mio repository (stavo seguendo un modello di repository nella guida ASP.NET) assomigliava a questo:

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

Il mio problema proveniva dalla configurazione iniziale del mio DbContext, quando ho usato DbSet come generico invece del tipo.

Sono passato public DbSet Contacts { get; set; }a public DbSet<Contact> Contacts { get; set; }e improvvisamente la query è stata riconosciuta.


Questo è probabilmente quello che dice km nella sua risposta, ma dal momento che ha menzionato IEnumerable<t>e non DbSet<<YourDomainObject>>ho dovuto scavare nel codice per un paio d'ore per trovare la linea che ha causato questo mal di testa.


0

Ho avuto lo stesso errore, ma per me è stato attribuito ad avere un database e una tabella con lo stesso nome. Quando ho aggiunto ADO .NET Entity Object al mio progetto, ha generato erroneamente ciò che volevo nel mio file di contesto del database:

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

che avrebbe dovuto essere:

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

E

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

di cui in realtà non avevo bisogno, quindi l'ho commentato.

Stavo cercando di inserire la mia tabella in questo modo, nel mio controller, quando ho ricevuto il mio errore:

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);
}

Ho corretto il contesto del database e tutto è andato bene, dopo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.