ไม่พบการนำรูปแบบการสืบค้นไปใช้


105

ในแอปพลิเคชัน Silverlight ของฉันฉันพยายามสร้างการเชื่อมต่อฐานข้อมูลโดยใช้ LINQ ก่อนอื่นฉันเพิ่ม LINQ ใหม่ในคลาส SQL และลากตารางของฉันชื่อ "tblPersoon" เข้าไป

จากนั้นในไฟล์บริการของฉันฉันพยายามเรียกใช้แบบสอบถามต่อไปนี้:

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

แต่ที่ tblPersoon ทำให้ฉันมีข้อผิดพลาดต่อไปนี้

ไม่พบการใช้งานรูปแบบการสืบค้นสำหรับแหล่งที่มาประเภท 'SilverlightApplication1.Web.tblPersoon' ไม่พบ 'ที่ไหน'

และแม้ว่าฉันจะลองทำสิ่งต่อไปนี้:

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

มันทำให้ฉันมีข้อผิดพลาดว่าไม่พบ 'เลือก'!

รหัสสำหรับคลาสที่สร้างขึ้นสำหรับตารางของฉันสามารถพบได้ที่นี่: http://pastebin.com/edx3XRhi

อะไรคือสาเหตุและฉันจะแก้ปัญหานี้ได้อย่างไร

ขอบคุณ.

คำตอบ:


263

กำลังtblPersoonดำเนินการอยู่IEnumerable<T>หรือไม่? คุณอาจต้องทำโดยใช้:

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

ข้อผิดพลาดประเภทนี้ ( ไม่พบการนำรูปแบบแบบสอบถามไปใช้ ) มักเกิดขึ้นเมื่อ:

  • คุณไม่มีการใช้งานเนมสเปซ LINQ ( using System.Linq)
  • ประเภทที่คุณกำลังสอบถามไม่ได้ใช้งาน IEnumerable<T>

แก้ไข :

นอกเหนือจากข้อเท็จจริงที่คุณค้นหา type ( tblPersoon) แทนที่จะเป็นคุณสมบัติtblPersoonsคุณยังต้องมีอินสแตนซ์บริบท (คลาสที่กำหนดtblPersoonsคุณสมบัติ) เช่นนี้:

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

DataClasses1.Desinger.cs ของฉัน (สร้างรหัส LINQ อัตโนมัติ) ไม่รวม IEnumerable <T> public System.Data.Linq.Table<tblPersoon> tblPersoons { get { return this.GetTable<tblPersoon>(); } } และเมื่อฉันใช้: var query = (จาก p ใน tblPersoon.Cast <Person> () เลือก p ).Single (); มันทำให้ฉันมีข้อผิดพลาดต่อไปนี้บน. Cast 'SilverlightApplication1.Web.tblPersoon' ไม่มีคำจำกัดความสำหรับ 'Cast'
Schoof

1
@ThomasSchoof: อาจจะพิมพ์ผิด? สถานที่ให้บริการที่เรียกว่าtblPersoons(หมายเหตุsตอนท้าย) tblPersoonในขณะที่ประเภทคือ คุณพิมพ์คำค้นหาแทนที่จะเป็นคุณสมบัติในประเภท
กม.

ถ้าฉันลองvar query = (from p in tblPersoons select p).Single();มันจะบอกฉันว่า tblPersoons ไม่ได้กระตุ้น
Schoof

1
ฉันไม่คิดว่า LINQ เป็น SQL มีไว้เพื่ออัปเดตฐานข้อมูล (ดังนั้นแบบสอบถามใน Language INtegrated Query) อย่างไรก็ตามคุณสามารถค้นหาความช่วยเหลือเกี่ยวกับหัวข้อเหล่านั้นได้ในหน้าLINQ ถึง SQL MSDN (อัปเดตโดยไม่ต้องสืบค้นส่วน)
กม.

29
การเพิ่ม โดยใช้ System.Linqทำเพื่อฉัน .. :)
Guruprasad J Rao

184

คุณอาจต้องเพิ่มusingคำสั่งลงในไฟล์ เทมเพลตคลาส Silverlight เริ่มต้นจะไม่มี:

using System.Linq;

ขอบคุณสำหรับคำตอบ แต่มีคำสั่งใช้อยู่แล้ว
Schoof

1
ขอบคุณสำหรับคำตอบ ... สิ่งนี้แก้ไขปัญหาของฉันได้ !!! แต่ ... มีคำอธิบายเพิ่มเติมที่คุณสามารถให้ได้หรือไม่?
โจ

สุดยอด !! ขอบคุณ
blue piranha

โกรธ. ขอบคุณ.
Barry

32

ตรวจสอบให้แน่ใจว่ามีการอ้างอิงเหล่านี้:

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

จากนั้นเพิ่มคำสั่งใช้

using System.Linq;

1
ขอบคุณมาก
Mohammed Z. Aljezawi

7

ฉันมีปัญหาที่คล้ายกันกับชุดข้อมูลที่สร้างขึ้นอย่างมากข้อความแสดงข้อผิดพลาดทั้งหมดคือ:

ไม่พบการนำรูปแบบแบบสอบถามไปใช้สำหรับแหล่งที่มาประเภท 'MyApp.InvcHeadDataTable' ไม่พบ 'ที่ไหน' พิจารณาระบุประเภทของตัวแปรช่วง "row" อย่างชัดเจน

จากรหัสของฉัน:

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

ดังนั้นฉันจึงทำตามที่แนะนำและระบุประเภทอย่างชัดเจน:

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

ซึ่งได้ผลการรักษา


5

คุณขาดความเท่าเทียมกัน:

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

where อนุประโยคต้องส่งผลให้เกิดบูลีน

หรือคุณไม่ควรใช้whereเลย:

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

ขอบคุณจริงๆฉันพลาดความเท่าเทียมซึ่งเป็นเรื่องโง่ของฉัน แต่ตอนนี้ฉันได้รับข้อผิดพลาดต่อไปนี้: ข้อผิดพลาด 1 ไม่พบการใช้งานรูปแบบการสืบค้นสำหรับแหล่งที่มาประเภท 'SilverlightApplication1.Web.tblPersoon' ไม่พบ 'ที่ไหน'
Schoof

0

ฉันมีข้อผิดพลาดเดียวกันกับที่อธิบายตามชื่อเรื่อง แต่สำหรับฉันมันเป็นเพียงการติดตั้ง Microsoft access 12.0 oledb แจกจ่ายซ้ำเพื่อใช้กับ LinqToExcel


0

สวัสดี วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการแปลง IEnumerable นี้เป็น Queryable

หากเป็นแบบสอบถามได้การดำเนินการค้นหาจะกลายเป็นเรื่องง่าย

โปรดตรวจสอบรหัสนี้:

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

ตรวจสอบให้แน่ใจว่าคุณมีSystem.Linq ด้วยวิธีนี้ข้อผิดพลาดของคุณจะได้รับการแก้ไข


0

สำหรับพวกคุณ (เช่นฉัน) ที่เสียเวลามากเกินไปจากข้อผิดพลาดนี้:

ฉันได้รับข้อผิดพลาดเดียวกัน: "ไม่พบการใช้รูปแบบการสืบค้นสำหรับแหล่งที่มาประเภท 'DbSet'" แต่วิธีแก้ปัญหาสำหรับฉันคือการแก้ไขข้อผิดพลาดที่ระดับ DbContext

เมื่อฉันสร้างบริบทของฉันฉันมีสิ่งนี้:

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

        public DbSet Contacts { get; set; }
    }

และ Repository ของฉัน (ฉันทำตามรูปแบบ Repository ในคู่มือ ASP.NET) มีลักษณะดังนี้:

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

ปัญหาของฉันมาจากการตั้งค่าเริ่มต้นของ DbContext ของฉันเมื่อฉันใช้ DbSet เป็นแบบทั่วไปแทนที่จะเป็นประเภท

ฉันเปลี่ยนpublic DbSet Contacts { get; set; }เป็นpublic DbSet<Contact> Contacts { get; set; }และทันใดนั้นคำถามก็จำได้


นี่อาจเป็นสิ่งที่กม. พูดในคำตอบของเขา แต่เนื่องจากเขาพูดถึงIEnumerable<t>และไม่ใช่DbSet<<YourDomainObject>>ฉันต้องขุดโค้ดเป็นเวลาสองสามชั่วโมงเพื่อค้นหาบรรทัดที่ทำให้ปวดหัวนี้


0

ฉันมีข้อผิดพลาดเดียวกัน แต่สำหรับฉันมันเกิดจากการมีฐานข้อมูลและตารางที่มีชื่อเหมือนกัน เมื่อฉันเพิ่ม ADO .NET Entity Object ในโครงการของฉันมันสร้างสิ่งที่ฉันต้องการในไฟล์บริบทฐานข้อมูลของฉันผิด:

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

ที่ควรจะเป็น:

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

และ

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

ซึ่งจริงๆแล้วฉันไม่ต้องการจริงๆดังนั้นฉันจึงแสดงความคิดเห็นออกไป

ฉันพยายามดึงตารางของฉันในลักษณะนี้ในตัวควบคุมของฉันเมื่อฉันได้รับข้อผิดพลาด:

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

ฉันแก้ไขบริบทฐานข้อมูลของฉันแล้วและทุกอย่างก็เรียบร้อยดีหลังจากนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.