क्वेरी पैटर्न का कार्यान्वयन नहीं मिल सका


101

अपने सिल्वरलाइट एप्लिकेशन में मैं LINQ का उपयोग करके एक डेटाबेस कनेक्शन बनाने की कोशिश कर रहा हूं। पहले मैं SQL क्लास में एक नया LINQ जोड़ता हूं, और इसमें "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

यह क्या कारण है और मैं संभवतः इसे कैसे हल करूंगा?

धन्यवाद।

जवाबों:


254

है tblPersoonको लागू करने IEnumerable<T>? आपको इसका उपयोग करने की आवश्यकता हो सकती है:

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

इस तरह की त्रुटि ( क्वेरी पैटर्न का कार्यान्वयन नहीं मिल सकता है ) आमतौर पर तब होती है जब:

  • आपको LINQ नामस्थान उपयोग ( using System.Linq) याद आ रहे हैं
  • आप जिस प्रकार से क्वेरी कर रहे हैं वह लागू नहीं होता है IEnumerable<T>

संपादित करें :

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 क्वेरी = (p से tblPersoon.Cast <Person> () p चुनें) .Single (); यह मुझे निम्नलिखित त्रुटियों पर देता है। 'SilverlightApplication1.Web.tblPersoon' में 'Cast' की परिभाषा नहीं है
Schoof

1
@ThomasSchoof: क्या यह टाइपो हो सकता है? संपत्ति कहा जाता है tblPersoons(ध्यान दें रों अंत में) प्रकार है, जबकि tblPersoon। आप प्रकार पर संपत्ति के बजाय क्वेरी टाइप करते हैं।
किमी

अगर मैं कोशिश var query = (from p in tblPersoons select p).Single();करता हूं तो यह मुझे बताता है कि tblPersoons भी उत्तेजित नहीं करता है।
शाओफ

1
मुझे नहीं लगता कि SQL को LINQ डेटाबेस को अपडेट करने के लिए था (इसलिए भाषा में क्वेरी क्वेरी में क्वेरी), हालाँकि आप LINQ पर SQL MSDN पेज ( अपडेट किए बिना सेक्शन से अपडेट किए ) में उन विषयों के साथ कुछ मदद पा सकते हैं ।
किमी

27
System.Linq का उपयोग करते हुए इसे जोड़ना मेरे लिए .. :)
गुरुप्रसाद राव

178

आपको usingफ़ाइल में एक स्टेटमेंट जोड़ना पड़ सकता है । डिफ़ॉल्ट सिल्वरलाइट क्लास टेम्पलेट इसमें शामिल नहीं है:

using System.Linq;

उत्तर के लिए धन्यवाद, लेकिन उपयोग कथन पहले से ही था।
शाओफ

1
जवाब के लिए धन्यवाद ... इससे मेरा मुद्दा सही हो गया !!! लेकिन ... क्या कोई अतिरिक्त स्पष्टीकरण है जो आप प्रदान कर सकते हैं?
जो

बहुत बढ़िया!! धन्यवाद
नीले पिरान्हा

क्रुद्ध। धन्यवाद।
बैरी


7

मेरे पास समान रूप से टाइप किए गए डेटासेट के साथ एक समान समस्या थी, पूर्ण त्रुटि संदेश था:

स्रोत प्रकार 'MyApp.InvcHeadDataTable' के लिए क्वेरी पैटर्न का कार्यान्वयन नहीं मिल सका। 'जहाँ' नहीं मिला। रेंज चर 'पंक्ति' के प्रकार को स्पष्ट रूप से निर्दिष्ट करने पर विचार करें।

मेरे कोड से:

        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' के लिए क्वेरी पैटर्न का कार्यान्वयन नहीं मिल सका। 'जहाँ' नहीं मिला।
शाओफ

0

मेरे पास शीर्षक द्वारा वर्णित के रूप में एक ही त्रुटि थी, लेकिन मेरे लिए यह केवल माइक्रोसॉफ्ट एक्सेस 12.0 oledb redistributable को LinqToExcel के साथ उपयोग करने के लिए स्थापित कर रहा था।


0

ऐसा करने का सबसे आसान तरीका हाय एक Queryable में इस IEnumerable कन्वर्ट करने के लिए है

यदि यह एक क्वेरी है, तो क्वेरी करना आसान हो जाता है।

कृपया इस कोड की जाँच करें:

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

और मेरा रिपॉजिटरी (मैं 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 एंटिटी ऑब्जेक्ट को जोड़ा, तो यह गलत था कि मैं अपने डेटाबेस संदर्भ फ़ाइल में क्या चाहता हूं:

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

मैंने अपने डेटाबेस के संदर्भ को सही किया और उसके बाद सब ठीक था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.