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.

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();
    // ...

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;

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;

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.


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

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.


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.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.