Nie można znaleźć implementacji wzorca zapytania

105

W mojej aplikacji Silverlight próbuję utworzyć połączenie z bazą danych za pomocą LINQ. Najpierw dodaję nową klasę LINQ to SQL i przeciągam do niej tabelę o nazwie „tblPersoon”.

Następnie w moim pliku serwisowym próbuję wykonać następujące zapytanie:

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

Ale w tblPersoon daje mi następujący błąd.

Nie można znaleźć implementacji wzorca zapytania dla typu źródła „SilverlightApplication1.Web.tblPersoon”. Nie znaleziono „Gdzie”.

A nawet gdy próbuję wykonać następujące czynności:

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

Wyświetla mi się błąd z informacją, że „Wybierz” nie znaleziono!

Kod wygenerowanej klasy dla mojej tabeli można znaleźć tutaj: http://pastebin.com/edx3XRhi

Co jest tego przyczyną i jak mógłbym to rozwiązać?

Dziękuję Ci.

Schoof
źródło

Odpowiedzi:

262

Czy tblPersoonwdrażanie IEnumerable<T>? Być może będziesz musiał to zrobić za pomocą:

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

Ten rodzaj błędu ( nie można znaleźć implementacji wzorca zapytania ) zwykle występuje, gdy:

  • Brakuje użycia przestrzeni nazw LINQ ( using System.Linq)
  • Typ, którego dotyczy zapytanie, nie jest implementowany IEnumerable<T>

Edycja :

Oprócz tego, że odpytujesz type ( tblPersoon) zamiast property tblPersoons, potrzebujesz również instancji kontekstu (klasy, która definiuje tblPersoonswłaściwość), na przykład:

public tblPersoon GetPersoonByID(string id)
{
    var context = new DataClasses1DataContext();
    var query = context.tblPersoons.Where(p => p.id == id).Single();
    // ...
km
źródło
Moje DataClasses1.Desinger.cs (kod generowany automatycznie przez LINQ) nie obejmuje IEnumerable <T>. public System.Data.Linq.Table<tblPersoon> tblPersoons { get { return this.GetTable<tblPersoon>(); } } A kiedy używam: var query = (from p in tblPersoon.Cast <Person> () select p) .Single (); Daje mi następujące błędy na .Cast. „SilverlightApplication1.Web.tblPersoon” nie zawiera definicji „Cast”
Schoof
1
@ThomasSchoof: czy to może być literówka? Właściwość jest wywoływana tblPersoons(zwróć uwagę na s na końcu), podczas gdy typ to tblPersoon. Zapytanie o typ zamiast właściwości typu.
km
Jeśli spróbuję, var query = (from p in tblPersoons select p).Single();to mówi mi, że tblPersoons nawet nie istnieje.
Schoof
1
Nie sądzę, aby LINQ to SQL miał aktualizować bazę danych (stąd zapytanie w zapytaniu zintegrowanym z językiem), jednak pomoc dotyczącą tych tematów można znaleźć na stronie LINQ to SQL MSDN ( sekcja Aktualizacja bez zapytań ).
km
29
Dodanie przy użyciu System.Linq zrobiło to za mnie .. :)
Guruprasad J Rao
184

Może być konieczne dodanie usingoświadczenia do pliku. Domyślny szablon klasy Silverlight go nie obejmuje:

using System.Linq;
Bryan Watts
źródło
Dzięki za odpowiedź, ale instrukcja using już tam była.
Schoof
1
Dzięki za odpowiedź ... to rozwiązało mój problem !!! ale ... czy możesz podać dodatkowe wyjaśnienie?
Joe
Niesamowite!! Dziękuję
niebieska pirania
doprowadzający do wściekłości. Dziękuję Ci.
Barry
31

Upewnij się, że uwzględniono te odniesienia:

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

Następnie dodaj instrukcję using

using System.Linq;
MobileMon
źródło
1
Dziękuję bardzo
Mohammed Z. Aljezawi
7

Miałem podobny problem z wygenerowanymi silnie wpisanymi zestawami danych, pełny komunikat o błędzie brzmiał:

Nie można znaleźć implementacji wzorca zapytania dla typu źródła „MyApp.InvcHeadDataTable”. Nie znaleziono „Gdzie”. Rozważ jawne określenie typu zmiennej zakresu „wiersz”.

Z mojego kodu:

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

Zrobiłem więc zgodnie z sugestią i wyraźnie określiłem typ:

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

Co zadziałało świetnie.

Stephen Turner
źródło
5

Brakuje Ci równości:

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

where klauzula musi skutkować wartością logiczną.

LUB wherew ogóle nie powinieneś używać :

var query = (from p in tblPersoon select p).Single();
Adriano Carneiro
źródło
Dziękuję, rzeczywiście brakowało mi mojej równości, co było głupotą z mojej strony. Ale teraz pojawia się następujący błąd: Błąd 1 Nie można znaleźć implementacji wzorca kwerendy dla typu źródła „SilverlightApplication1.Web.tblPersoon”. Nie znaleziono „Gdzie”.
Schoof
0

Miałem ten sam błąd, który opisał w tytule, ale dla mnie był to po prostu instalacja redystrybucyjnego oprogramowania Microsoft Access 12.0 oledb do użytku z LinqToExcel.

BanMe
źródło
0

Cześć Najprostszym sposobem na to jest przekształcenie tego IEnumerable do Queryable

Jeśli można zapytać, wykonywanie zapytań staje się łatwe.

Sprawdź ten kod:

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

Upewnij się, że uwzględniono System.Linq . W ten sposób twój błąd zostanie rozwiązany.

Abhay Shiro
źródło
0

Dla tych z Was (takich jak ja), którzy zmarnowali zbyt dużo czasu z powodu tego błędu:

Otrzymałem ten sam błąd: „Nie można znaleźć implementacji wzorca zapytania dla typu źródła 'DbSet'”, ale rozwiązaniem dla mnie było naprawienie błędu na poziomie DbContext.

Kiedy tworzyłem swój kontekst, miałem to:

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

        public DbSet Contacts { get; set; }
    }

A moje repozytorium (śledziłem wzorzec repozytorium w przewodniku ASP.NET) wyglądało tak:

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

Mój problem pochodzi z początkowej konfiguracji mojego DbContext, kiedy użyłem DbSet jako ogólnego zamiast typu.

Zmieniłem public DbSet Contacts { get; set; }na public DbSet<Contact> Contacts { get; set; }i nagle zapytanie zostało rozpoznane.


Prawdopodobnie tak mówi km w swojej odpowiedzi, ale skoro wspomniał, IEnumerable<t>a nie DbSet<<YourDomainObject>>, musiałem grzebać w kodzie przez kilka godzin, aby znaleźć linię, która spowodowała ten ból głowy.

TylerSmall19
źródło
0

Miałem ten sam błąd, ale dla mnie przypisywano go posiadaniu bazy danych i tabeli, które miały takie same nazwy. Kiedy dodałem obiekt ADO .NET Entity do mojego projektu, błędnie wygenerowałem to, co chciałem w pliku kontekstu mojej bazy danych:

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

co powinno być:

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

I

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

którego tak naprawdę nie potrzebowałem, więc skomentowałem to.

Próbowałem wciągnąć swój stół w ten sposób, w moim kontrolerze, kiedy otrzymałem błąd:

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

Poprawiłem kontekst mojej bazy danych i po tym wszystko było w porządku.

vapcguy
źródło