Es konnte keine Implementierung des Abfragemusters gefunden werden

101

In meiner Silverlight-Anwendung versuche ich, mit LINQ eine Datenbankverbindung herzustellen. Zuerst füge ich der SQL-Klasse einen neuen LINQ hinzu und ziehe meine Tabelle mit dem Namen "tblPersoon" hinein.

Dann versuche ich in meiner Servicedatei die folgende Abfrage auszuführen:

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

Aber bei tblPersoon gibt es mir den folgenden Fehler.

Es konnte keine Implementierung des Abfragemusters für den Quelltyp 'SilverlightApplication1.Web.tblPersoon' gefunden werden. 'Wo' nicht gefunden.

Und selbst wenn ich Folgendes versuche:

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

Es wird eine Fehlermeldung angezeigt, dass "Auswählen" nicht gefunden wurde!

Code für die generierte Klasse für meine Tabelle finden Sie hier: http://pastebin.com/edx3XRhi

Was verursacht das und wie würde ich das möglicherweise lösen?

Danke dir.

Schoof
quelle

Antworten:

253

Ist die tblPersoonImplementierung IEnumerable<T>? Möglicherweise müssen Sie Folgendes tun:

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

Diese Art von Fehler ( Implementierung des Abfragemusters konnte nicht gefunden werden ) tritt normalerweise auf, wenn:

  • Sie vermissen die Verwendung des LINQ-Namespace ( using System.Linq)
  • Der Typ, den Sie abfragen, wird nicht implementiert IEnumerable<T>

Bearbeiten :

Abgesehen davon, dass Sie type ( tblPersoon) anstelle von property abfragen tblPersoons, benötigen Sie auch eine Kontextinstanz (Klasse, die tblPersoonsEigenschaft definiert ) wie folgt:

public tblPersoon GetPersoonByID(string id)
{
    var context = new DataClasses1DataContext();
    var query = context.tblPersoons.Where(p => p.id == id).Single();
    // ...
km
quelle
Meine DataClasses1.Desinger.cs (Code, den LINQ automatisch generiert) enthält nicht IEnumerable <T>. public System.Data.Linq.Table<tblPersoon> tblPersoons { get { return this.GetTable<tblPersoon>(); } } Und wenn ich benutze: var query = (von p in tblPersoon.Cast <Person> () wähle p) .Single (); Es gibt mir die folgenden Fehler auf .Cast. 'SilverlightApplication1.Web.tblPersoon' enthält keine Definition für 'Cast'
Schoof
1
@ ThomasSchoof: Könnte es ein Tippfehler sein? Die Eigenschaft wird aufgerufen tblPersoons(beachten Sie das s am Ende), während der Typ ist tblPersoon. Sie fragen den Typ anstelle der Eigenschaft für den Typ ab.
km
Wenn ich es versuche, var query = (from p in tblPersoons select p).Single();sagt es mir, dass tblPersoons nicht einmal existiert.
Schoof
1
Ich glaube nicht, dass LINQ to SQL zum Aktualisieren der Datenbank gedacht war (daher Abfrage in Language INtegrated Query), aber Sie können Hilfe zu diesen Themen auf der MSDN-Seite von LINQ to SQL finden ( Abschnitt Aktualisieren ohne Abfrage ).
km
27
Das Hinzufügen mit System.Linq hat es für mich getan .. :)
Guruprasad Rao
176

Möglicherweise müssen Sie usingder Datei eine Anweisung hinzufügen . Die Standardvorlage für Silverlight-Klassen enthält sie nicht:

using System.Linq;
Bryan Watts
quelle
Danke für die Antwort, aber die using-Anweisung war schon da.
Schoof
1
Danke für die Antwort ... das hat mein Problem behoben !!! aber ... gibt es eine zusätzliche Erklärung, die Sie geben können?
Joe
Genial!! Vielen Dank
blaue Piranha
ärgerlich. Danke dir.
Barry
29

Stellen Sie sicher, dass diese Referenzen enthalten sind:

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

Fügen Sie dann die using-Anweisung hinzu

using System.Linq;
MobileMon
quelle
1
Vielen Dank
Mohammed Z. Aljezawi
7

Ich hatte ein ähnliches Problem mit generierten stark typisierten Datensätzen. Die vollständige Fehlermeldung lautete:

Es konnte keine Implementierung des Abfragemusters für den Quelltyp 'MyApp.InvcHeadDataTable' gefunden werden. 'Wo' nicht gefunden. Geben Sie den Typ der Bereichsvariablen 'row' explizit an.

Aus meinem Code:

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

Also habe ich getan, was es vorgeschlagen und den Typ explizit angegeben hat:

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

Welches war ein Vergnügen.

Stephen Turner
quelle
5

Ihnen fehlt eine Gleichheit:

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

where Klausel muss zu einem Booleschen Wert führen.

ODER Sie sollten überhaupt nicht verwenden where:

var query = (from p in tblPersoon select p).Single();
Adriano Carneiro
quelle
Danke, mir fehlte tatsächlich meine Gleichheit, was dumm von mir war. Jetzt wird jedoch der folgende Fehler angezeigt: Fehler 1 Es konnte keine Implementierung des Abfragemusters für den Quelltyp 'SilverlightApplication1.Web.tblPersoon' gefunden werden. 'Wo' nicht gefunden.
Schoof
0

Ich hatte den gleichen Fehler wie im Titel beschrieben, aber für mich war es einfach, Microsoft Access 12.0 oledb zu installieren, das für die Verwendung mit LinqToExcel weiterverteilbar ist.

BanMe
quelle
0

Der einfachste Weg, dies zu tun, besteht darin, diese IEnumerable in eine Queryable umzuwandeln

Wenn es sich um eine Abfrage handelt, ist das Ausführen von Abfragen einfach.

Bitte überprüfen Sie diesen Code:

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

Stellen Sie sicher, dass Sie einschließen Stellen System.Linq einschließen . Auf diese Weise wird Ihr Fehler behoben.

Abhay Shiro
quelle
0

Für diejenigen von Ihnen (wie mich), die durch diesen Fehler zu viel Zeit verschwendet haben:

Ich hatte den gleichen Fehler erhalten: "Die Implementierung des Abfragemusters für den Quelltyp 'DbSet' konnte nicht gefunden werden", aber die Lösung für mich bestand darin, einen Fehler auf DbContext-Ebene zu beheben.

Als ich meinen Kontext erstellte, hatte ich Folgendes:

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

        public DbSet Contacts { get; set; }
    }

Und mein Repository (ich folgte einem Repository-Muster im ASP.NET-Handbuch) sah folgendermaßen aus:

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

Mein Problem ergab sich aus der Ersteinrichtung meines DbContext, als ich DbSet als generisches Element anstelle des Typs verwendete.

Ich wechselte public DbSet Contacts { get; set; }zu public DbSet<Contact> Contacts { get; set; }und plötzlich wurde die Abfrage erkannt.


Dies ist wahrscheinlich, was km in seiner Antwort sagt, aber da er es erwähnte IEnumerable<t>und nicht, musste DbSet<<YourDomainObject>>ich ein paar Stunden im Code herumgraben, um die Zeile zu finden, die diese Kopfschmerzen verursachte.

TylerSmall19
quelle
0

Ich hatte den gleichen Fehler, aber für mich wurde er darauf zurückgeführt, dass eine Datenbank und eine Tabelle den gleichen Namen hatten. Als ich das ADO .NET-Entitätsobjekt zu meinem Projekt hinzufügte, wurde das, was ich wollte, in meiner Datenbankkontextdatei falsch generiert:

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

was hätte sein sollen:

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

Und

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

was ich eigentlich nicht wirklich brauchte, also habe ich es auskommentiert.

Ich habe versucht, meinen Tisch so in meinen Controller zu ziehen, als ich meinen Fehler bekam:

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

Ich habe meinen Datenbankkontext korrigiert und danach war alles in Ordnung.

vapcguy
quelle