2011-03-24 6 views
6

मैं एक प्रश्न है कि इस तरह दिखता है:इकाई की रूपरेखा के लिए LINQ में एसक्यूएल वाइल्डकार्ड का उपयोग कैसे

IQueryable<Profile> profiles = from p in connection.Profiles 
    where profile.Email.Contains(txtSearch) 
    select p; 

मुझे पता है कि इसे इस्तेमाल करता है जब यह SQL में बदल जाती है एक LIKE '%<value of txtSearch>%' लेकिन अगर txtSearch = "jon%gmail.com" यह यह करने के लिए `धर्मान्तरित जैसे '% जोन ~% gmail.com%'। ~ एक जंगली कार्ड है जो मध्य में% से बच निकलता है। मैं उसके आसपास कैसे हो सकता हूं? मुझे अपने LINQ में ईएफ खोजों में जंगली कार्ड डालने में सक्षम होना चाहिए।

उत्तर

2

मुझे यकीन नहीं है कि यह सीधे linq के साथ संभव है क्योंकि आप केवल Contains, StartsWith या EndsWith जैसे मूल स्ट्रिंग फ़ंक्शंस को कॉल कर सकते हैं। It is possible with Entity SQL ताकि आप इन दृष्टिकोणों को जोड़ सकें।

var query = new ObjectQuery<Profile>(
    @"SELECT VALUE p 
     FROM CsdlContainerName.Profiles AS p 
     WHERE p.Email LIKE '" + wildcardSearch + "'", 
    context); 

var result = query.AsQueryable().OrderByDescending(p => p.Name).ToList(); 

ESQL इंजेक्शन हमलों वापस :)

(मैं इसे की कोशिश नहीं की, लेकिन यह काम करना चाहिए) इंजेक्शन भेद्यता बिना

दूसरा संस्करण:

var commandText = 
    @"SELECT VALUE p 
     FROM CsdlContainerName.Profiles AS p 
     WHERE p.Email LIKE @search"; 

var query = new ObjectQuery<Profile>(commandText, context); 
query.Parameters.Add(new ObjectParameter("search", wildcardSearch)); 

var result = query.AsQueryable().OrderByDescending(p => p.Name).ToList(); 
+0

पेज मैं बनाने रहा एक व्यवस्थापक पृष्ठ है तो मैं एक एसक्यूएल इंजेक्शन हमले के बारे में चिंतित नहीं हूं लेकिन उपरोक्त विधि मुझे एसक्यूएल इंजेक्शन हमले के लिए खोल नहीं पाएगी? –

+0

मुझे लगता है कि यह करता है लेकिन वास्तव में इसे आजमाया नहीं है (मेरी टिप्पणी कोड स्निपेट को देखें)। लेकिन आप पैरामीटर के साथ संस्करण का भी उपयोग कर सकते हैं - मैं इसे दूसरे उदाहरण के रूप में जोड़ूंगा। –

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