2010-09-07 13 views
6

मैं इस के साथ अपने बालों को फाड़ रहा हूं। मुझे खोज शब्द की एक सरणी मिली है और मैं सरणी में प्रत्येक आइटम के विरुद्ध फ़ील्ड मानों को खोजने के लिए LINQ से SQL क्वेरी करने का प्रयास कर रहा हूं।LINQ से SQL क्वेरी सहायता (स्ट्रिंग में स्ट्रिंग सरणी में कोई स्ट्रिंग है)

मैं इतनी दूर मिल गया ..

var searchResults = 
    from x in SDC.Staff_Persons 
    where staffTermArray.Any(pinq => x.Forename.Contains(pinq)) 
     || staffTermArray.Any(pinq => x.Surname.Contains(pinq)) 
     || staffTermArray.Any(pinq => x.Known_as.Contains(pinq)) 
    orderby x.Surname 
    select x; 

... लेकिन फिर मिला

स्थानीय अनुक्रम ऑपरेटरों शामिल छोड़कर क्वेरी की एसक्यूएल कार्यान्वयन के लिए LINQ में उपयोग नहीं किया जा सकता है() ऑपरेटर

... और अब मैं अटक गया हूं।

यदि कोई मदद कर सकता है तो मैं बहुत आभारी हूं। अग्रिम धन्यवाद।

रोब

उत्तर

5

मुझे यकीन है कि अगर यह सबसे आसान समाधान है नहीं कर रहा हूँ, लेकिन यह काम करेगा:

var filter = CreateFilter(staffTermArray); 

var searchResults = 
    from person in SDC.Staff_Persons.Where(filter) 
    orderby person.Surname 
    select person; 



private static Expression<Func<Staff_Person, bool>> CreateFilter(
    string[] staffTermArray) 
{ 
    var predicate = PredicateBuilder.False<Staff_Person>(); 

    foreach (var staffTerm in staffTermArray) 
    { 
     // We need to make a local copy because of C# weirdness. 
     var ping = staffTerm; 

     predicate = predicate.Or(p => p.Forename.Contains(ping)); 
     predicate = predicate.Or(p => p.Surname.Contains(ping)); 
     predicate = predicate.Or(p => p.Known_as.Contains(ping)); 
    } 

    return predicate; 
} 

आप इस के लिए PredicateBuilder जरूरत है काम करने के लिए होगा।

+0

वाह - मैं समाधान की खोज करते समय 'predicate builder' शब्द भर जाऊंगा लेकिन किसी ने इसे सरल शब्दों में समझाया नहीं है! आपका बहुत बहुत धन्यवाद!! – LiverpoolsNumber9

-1

एक विकल्प एसक्यूएल के बजाय ग्राहक पर फ़िल्टरिंग करना होगा। AsEnumerable() पर कॉल करके आप ग्राहक पर मूल्यांकन के लिए where को मजबूर कर सकते हैं। हालांकि, इसका मतलब यह है कि तालिका के प्रत्येक पंक्ति को एक मैच के लिए परीक्षण करने से पहले स्मृति में लोड किया जाता है, इसलिए यदि आपकी खोज बड़ी तालिका से केवल थोड़ी सी संख्या से मेल खाती है तो यह अस्वीकार्य रूप से अक्षम हो सकती है।

var allPersons = 
    from x in SDC.Staff_Persons 
    orderby x.Surname 
    select x; 

var searchResults = 
    from x in allPersons.AsEnumerable() 
    where staffTermArray.Any(pinq => x.Forename.Contains(pinq)) 
     || staffTermArray.Any(pinq => x.Surname.Contains(pinq)) 
     || staffTermArray.Any(pinq => x.Known_as.Contains(pinq)) 
    select x; 
+0

हाँ, मेरे पास यह विचार था, और वास्तव में यह केवल 1200 रिकॉर्ड है ताकि यह बहुत बुरा न हो। लेकिन मेरा लोड-टाइम ओसीडी मुझे रोक रहा है ... :) – LiverpoolsNumber9

+0

समस्या पर यह हो सकता है कि यह एक छोटे से परीक्षण डेटाबेस पर बहुत अच्छा काम करता है, लेकिन क्लाइंट के बड़े डेटा में पहुंचने के बाद यह शानदार ढंग से विफल हो जाएगा। मैं एक ऐसे मामले में भाग गया जहां हम 4.8 मिलियन लाइनों के साथ एक लॉग टेबल देख रहे थे और इसे सब लोड कर रहे थे और फिर फ़िल्टरिंग सिर्फ एक विकल्प नहीं था। – MBentley

संबंधित मुद्दे