2009-04-13 8 views
8

मैं एक SQL क्वेरी लिखने की कोशिश कर रहा हूं जो दर्ज किए गए फ़ील्ड द्वारा ग्रिडव्यू फ़िल्टर करता है। चार फ़ील्ड, शीर्षक, प्रथम नाम, उपनाम और कंपनी नाम हैं।LINQ SQL क्वेरी जांचें कि कोई ऑब्जेक्ट फ़ील्ड शून्य नहीं है

पहले तीन ठीक हैं क्योंकि वे कभी शून्य नहीं हैं लेकिन चौथा शून्य हो सकता है। निम्नलिखित LINQ क्वेरी बस ठीक काम करता है:

var listofclients = from client in allcients 
        where client.Title.ToLower().Contains(titletxtbox.Text.Trim().ToLower()) 
        where client.Firstname.ToLower().Contains(firstnametxtbox.Text.Trim().ToLower()) 
        where client.Surname.ToLower().Contains(surnametxtbox.Text.Trim().ToLower()) 
        orderby client.Name 

लेकिन जब मैं कोशिश करते हैं और कंपनी के लिए इसे में एक फिल्टर डाल मैं जब कंपनी रिक्त है कार्यावधि में एक त्रुटि प्राप्त होगी

var listofclients = from client in allcients 
        where client.Title.ToLower().Contains(titletxtbox.Text.Trim().ToLower()) 
        where client.Firstname.ToLower().Contains(firstnametxtbox.Text.Trim().ToLower()) 
        where client.Surname.ToLower().Contains(surnametxtbox.Text.Trim().ToLower()) 
        where client.Company.Name.ToLower().Contains(companynametxtbox.Text.Trim().ToLower()) 
        orderby client.Name 

क्या मैं करूंगा जानना, क्या क्वेरी बनाने का कोई तरीका है ताकि यह केवल क्लाइंट के दौरान फ़िल्टर हो। कॉम्पनी फ़ील्ड शून्य नहीं है।

मैं एसक्यूएल इंजेक्शन के लिए भी कमजोर हूं या जैसे कि मैं इस तरह के टेक्स्टबॉक्स फ़ील्ड से सीधे खींचता हूं। मुझे इस मामले में पता है कि यह डीबी से जुड़ा नहीं है, लेकिन अगर यह एक बूंद हो सकता है। या यहां तक ​​कि अगर यह डीबी से जुड़ा हुआ नहीं है तो क्या वे सूची में वस्तुओं के साथ परेशान हो सकते हैं?

धन्यवाद

जॉन हॉकिन्स

उत्तर

5

मैं आप सभी से मेल खाते रिकॉर्ड चाहते हैं, जहां कंपनी रिक्त है, लेकिन जब कंपनी से मौजूद है नाम द्वारा फ़िल्टर संभालने हूँ। निम्नलिखित करना चाहिए। साथ ही, आपको SQL इंजेक्शन के बारे में चिंता करने की आवश्यकता नहीं है क्योंकि LINQToSQL पैरामीटरयुक्त क्वेरी का उपयोग करता है। यदि आप XSS हमलों से बचने के लिए उन पर आवेषण करना चाहते हैं और वेब पर किसी भी मूल्य को प्रदर्शित करने का इरादा रखते हैं तो आपको क्लाइंट नियंत्रण में होने वाले किसी भी HTML को साफ करने की चिंता करनी होगी।

var listofclients = from client in allcients 
        where client.Title.ToLower().Contains(titletxtbox.Text.Trim().ToLower()) 
        where client.Firstname.ToLower().Contains(firstnametxtbox.Text.Trim().ToLower()) 
        where client.Surname.ToLower().Contains(surnametxtbox.Text.Trim().ToLower()) 
        where client.Company == null || client.Company.Name.ToLower().Contains(companynametxtbox.Text.Trim().ToLower()) 
        orderby client.Name 
3
var listofclients = from client in allcients 
        orderby client.Name 
        select client; 

if (string.IsNullOrEmpty(titletxtbox.Text)) 
listofclients = listofclients.Where(l=>l.Title.Contains(titletxtbox.Text)) 

........

इस

+0

कि पुनः प्राप्त डेटासेट पर छानने हालांकि करेंगे। मुझे लगता है कि जॉन चाहता है कि एसक्यूएल चयन के हिस्से के रूप में कंपनी का नाम शामिल किया जाए। – sipwiz

+0

@sipwiz: नहीं। जब तक "से ... चुनें" पर कॉल करने वाला कोई ToList() या समकक्ष नहीं है, ऑब्जेक्ट listofclient एक IQueryable है (इसलिए इस बिंदु पर कोई डेटा पुनर्प्राप्त नहीं किया गया है)। जिसका अर्थ है कि अनुरोध अभी भी निष्पादित नहीं किया गया है, इसलिए डेटा को पुनर्प्राप्त करने से पहले "कहां" खंड किया जाएगा। –

+0

हाँ बिल्कुल तभी जब आप ToList या इसी तरह की विधि को वास्तविक एसक्यूएल आमंत्रण कहते हैं। – omoto

1

1) LINQ एसक्यूएल अपने प्रश्नों में पैरामीटर का उपयोग करता करने के लिए की तरह कुछ है, तो यह एसक्यूएल इंजेक्शन के लिए कमजोर नहीं है। फिर भी, कभी भी उपयोगकर्ता इनपुट ट्रस्ट नहीं करें।

2) लिंक मुफ्त शून्य जांच प्रदान नहीं करता है, क्षमा करें। आप अपने LINQ क्वेरी ट्रिम और फिट रखने के लिए एक सरल विस्तार विधि के साथ ऐसा कर सकते हैं, यद्यपि,:

public static class StringExtensions 
{ 
    public static bool ContainsEx(this string me, string other) 
    { 
    if(me == null || other == null) return false; 
    // This is a better way of performing a case-insensitive Contains 
    return me.IndexOf(other, 0, StringComparison.OrdinalIgnoreCase) != -1; 
    } 
} 
+0

लटका! मुझे इसे बेहतर बनाने के लिए संपादन कोड से नफरत है, केवल एक बग पेश करने के लिए! – Will

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