2011-02-27 18 views
5

मेरे पास एक वैकल्पिक उपयोगकर्ता नाम फ़ील्ड के साथ एक खोज फ़ॉर्म है। यदि उपयोगकर्ता नाम की आपूर्ति नहीं की जाती है तो सभी मैचों को वापस किया जाना चाहिए।वैकल्पिक के साथ लिंक जहां क्लॉज और एसक्यूएल सर्वर सीई

मैं लिंक और एसक्यूएल सर्वर सीई 4.0 का उपयोग कर रहा हूं।

LINQ कोड ऐसा दिखाई देता है -।>

from p in context.Accounts 
where (name==string.Empty || p.UserName.Contains(name)) 

Sql सर्वर सीई के साथ इस निम्न त्रुटि

फेंकता है "एक पैरामीटर इस स्थान में अनुमति नहीं है सुनिश्चित करें कि '@' चिह्न एक मान्य स्थान में है या पैरामीटर इस SQL ​​कथन में मान्य हैं। "

क्या कोई अन्य दृष्टिकोण है जिसे मैं वैकल्पिक रूप से ले सकता हूं जहां लिंक में क्लॉज हैं?

FYI करें निम्नलिखित

from p in context.Accounts 
where (string.IsNullOrEmpty(name) || p.UserName.Contains(name)) 

मुझे त्रुटि

देता है "समारोह के लिए निर्दिष्ट तर्क मान मान्य नहीं है। [तर्क # = 1, समारोह का नाम (यदि जाना जाता है) = isnull] "}

यह एसक्यूएल सर्वर सीई के कारण IsNull का समर्थन नहीं कर रहा है। अगर नाम पैरामीटर शून्य है तो मैं बस नीचे करूँगा।

if (name == null) 
    name = string.Empty; 

उत्तर

9

इस प्रयास करें:

var query = from p in context.Accounts 
      select p; 

if (!string.IsNullOrEmpty(name)) { 
    query = query.Where(p => p.UserName.Contains(name)); 
} 

कोई नियम कह क्वेरी एक भी बयान में हो गया है है। जब तक आप वास्तव में इसे निष्पादित नहीं करते हैं, तब तक आप मौजूदा क्वेरी पर जोड़ सकते हैं।

+0

क्या यह निष्पादित होने पर एक एसक्यूएल कथन पर संकलित होगा? या फिर यह सभी खातों को तब फ़िल्टर करेगा जैसे फिल्टर आदि। जैसे कहें कि मेरे पास 10,000 खाते हैं, वे सभी को स्मृति में खींचा जाएगा और फिर फ़िल्टर किया जाएगा? – Kenoyer130

+0

@ Kenoyer130, यह एक एसक्यूएल कथन के लिए संकलित होगा। –

+2

@ Kenoyer130 आपको LINQ देरी निष्पादन के बारे में कुछ पढ़ना चाहिए या आपको आश्चर्य और बग्स नहीं मिलेगी;) – Guillaume86