Tidak dapat menemukan implementasi dari pola kueri

105

Dalam aplikasi Silverlight saya, saya mencoba membuat koneksi database menggunakan LINQ. Pertama saya menambahkan LINQ baru ke kelas SQL, dan menyeret tabel saya yang disebut "tblPersoon" ke dalamnya.

Kemudian di file layanan saya, saya mencoba menjalankan kueri berikut:

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

Tapi di tblPersoon, saya mendapat error berikut.

Tidak dapat menemukan implementasi pola kueri untuk jenis sumber 'SilverlightApplication1.Web.tblPersoon'. 'Dimana' tidak ditemukan.

Dan bahkan ketika saya mencoba yang berikut ini:

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

Ini memberi saya kesalahan mengatakan 'Pilih' tidak ditemukan!

Kode untuk kelas yang dihasilkan untuk tabel saya dapat ditemukan di sini: http://pastebin.com/edx3XRhi

Apa yang menyebabkan ini dan bagaimana saya bisa mengatasinya?

Terima kasih.

Schoof
sumber

Jawaban:

263

Apakah tblPersoonimplementasinya IEnumerable<T>? Anda mungkin perlu melakukannya dengan menggunakan:

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

Jenis kesalahan ini ( Tidak dapat menemukan implementasi pola kueri ) biasanya terjadi ketika:

  • Anda kehilangan penggunaan namespace LINQ ( using System.Linq)
  • Jenis yang Anda kueri tidak diterapkan IEnumerable<T>

Edit :

Selain fakta bahwa Anda query type ( tblPersoon) daripada properti tblPersoons, Anda juga memerlukan instance konteks (kelas yang mendefinisikan tblPersoonsproperti), seperti ini:

public tblPersoon GetPersoonByID(string id)
{
    var context = new DataClasses1DataContext();
    var query = context.tblPersoons.Where(p => p.id == id).Single();
    // ...
km
sumber
DataClasses1.Desinger.cs saya (kode LINQ otomatis dihasilkan) tidak menyertakan IEnumerable <T>. public System.Data.Linq.Table<tblPersoon> tblPersoons { get { return this.GetTable<tblPersoon>(); } } Dan ketika saya menggunakan: var query = (dari p di tblPersoon.Cast <Person> () pilih p) .Single (); Ini memberi saya kesalahan berikut pada .Cast. 'SilverlightApplication1.Web.tblPersoon' tidak mengandung definisi untuk 'Cast'
Schoof
1
@ ThomasSchoof: mungkinkah salah ketik? Properti dipanggil tblPersoons(perhatikan s di akhir) sedangkan tipe adalah tblPersoon. Anda tipe kueri, bukan properti pada tipe.
km
Jika saya mencobanya, var query = (from p in tblPersoons select p).Single();Ini memberi tahu saya tblPersoons bahkan tidak ada.
Schoof
1
Saya tidak berpikir LINQ ke SQL dimaksudkan untuk memperbarui database (karenanya kueri dalam Bahasa Query Terintegrasi), namun Anda dapat menemukan beberapa bantuan dengan topik tersebut di halaman LINQ ke SQL MSDN ( bagian Memperbarui Tanpa Kueri ).
km
29
Menambahkan menggunakan System.Linq melakukannya untuk saya .. :)
Guruprasad J Rao
184

Anda mungkin perlu menambahkan usingpernyataan ke file. Templat kelas Silverlight default tidak menyertakannya:

using System.Linq;
Bryan Watts
sumber
Terima kasih atas jawabannya, tetapi pernyataan menggunakan sudah ada.
Schoof
1
Terima kasih atas jawabannya ... ini memperbaiki masalah saya !!! tapi ... apakah ada penjelasan tambahan yang bisa Anda berikan?
Joe
Luar biasa !! Terima kasih
piranha biru
menyebalkan. Terima kasih.
Barry
32

Pastikan referensi ini disertakan:

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

Kemudian tambahkan pernyataan use

using System.Linq;
MobileMon
sumber
1
Terima kasih banyak
Mohammed Z. Aljezawi
7

Saya memiliki masalah serupa dengan kumpulan data yang diketik dengan kuat, pesan kesalahan lengkapnya adalah:

Tidak dapat menemukan implementasi pola kueri untuk jenis sumber 'MyApp.InvcHeadDataTable'. 'Dimana' tidak ditemukan. Pertimbangkan secara eksplisit menentukan jenis 'baris' variabel rentang.

Dari kode saya:

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

Jadi saya melakukan seperti yang disarankan dan secara eksplisit menentukan jenisnya:

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

Yang berhasil.

Stephen Turner
sumber
5

Anda kehilangan kesetaraan:

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

where klausa harus menghasilkan boolean.

ATAU Anda tidak boleh menggunakan wheresama sekali:

var query = (from p in tblPersoon select p).Single();
Adriano Carneiro
sumber
Terima kasih, saya memang merindukan kesetaraan saya, yang merupakan kebodohan saya. Tapi sekarang saya mendapatkan kesalahan berikut: Kesalahan 1 Tidak dapat menemukan implementasi pola kueri untuk jenis sumber 'SilverlightApplication1.Web.tblPersoon'. 'Dimana' tidak ditemukan.
Schoof
0

Saya mengalami kesalahan yang sama seperti yang dijelaskan oleh judul, tetapi bagi saya itu hanya menginstal akses Microsoft 12.0 oledb yang dapat didistribusikan ulang untuk digunakan dengan LinqToExcel.

BanMe
sumber
0

Hai, cara termudah untuk melakukannya adalah dengan mengubah IEnumerable ini menjadi Querizable

Jika itu dapat dikueri, maka melakukan kueri menjadi mudah.

Silakan periksa kode ini:

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

Pastikan Anda menyertakan System.Linq . Dengan cara ini kesalahan Anda akan teratasi.

Abhay Shiro
sumber
0

Bagi Anda (seperti saya) yang terlalu banyak menyia-nyiakan waktu dari kesalahan ini:

Saya telah menerima kesalahan yang sama: "Tidak dapat menemukan implementasi Pola kueri untuk jenis sumber 'DbSet'" tetapi solusi bagi saya adalah memperbaiki kesalahan pada tingkat DbContext.

Ketika saya membuat konteks saya, saya memiliki ini:

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

        public DbSet Contacts { get; set; }
    }

Dan Repositori saya (saya mengikuti pola Repositori dalam panduan ASP.NET) terlihat seperti ini:

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

Masalah saya berasal dari pengaturan awal DbContext saya, ketika saya menggunakan DbSet sebagai generik dan bukan tipe.

Saya berubah public DbSet Contacts { get; set; }menjadi public DbSet<Contact> Contacts { get; set; }dan tiba-tiba permintaan itu dikenali.


Ini mungkin yang km katakan dalam jawabannya, tetapi karena dia menyebutkan IEnumerable<t>dan tidak, DbSet<<YourDomainObject>>saya harus menggali kode selama beberapa jam untuk menemukan baris yang menyebabkan sakit kepala ini.

TylerSmall 19
sumber
0

Saya mengalami kesalahan yang sama, tetapi bagi saya, itu dikaitkan dengan memiliki database dan tabel yang diberi nama sama. Ketika saya menambahkan ADO .NET Entity Object ke proyek saya, itu salah paham dengan apa yang saya inginkan dalam file konteks database saya:

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

yang seharusnya:

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

Dan

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

yang sebenarnya tidak terlalu saya butuhkan, jadi saya mengomentarinya.

Saya mencoba menarik tabel saya seperti ini, di pengontrol saya, ketika saya mendapatkan kesalahan saya:

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

Saya mengoreksi konteks database saya dan semuanya baik-baik saja, setelah itu.

vapcguy
sumber