2009-10-26 21 views
5

LINQ के लिए खोज सशर्त जहां खंड है, मैं this article पाया, जिस तरह से वे का उपयोग नीचे की तरह है:Linq सशर्त कहाँ खंड

var logs = from log in context.Logs 
      select log; 

if (filterBySeverity) 
    logs = logs.Where(p => p.Severity == severity); 

if (filterByUser) 
    logs = logs.Where(p => p.User == user); 

लेकिन मैं सोच रहा था इस विधि कुशल है? लिनक कितने सवाल करेगा?

+0

मैंने जवाब देखा है और मुझे लगता है कि यह विधि - जबकि यह कम कुशल हो सकती है निश्चित रूप से एक प्रकार की सुरक्षा बिंदु से बहुत बेहतर है। आखिरकार, शुरुआत के लिए, LINQ को गतिशील प्रश्नों से बचने के लिए डिज़ाइन किया गया था, इसलिए यह एक प्रकार का व्यर्थ है और दूसरी बात यह है कि यदि आप सावधान नहीं हैं तो यह हमेशा एसक्यूएल इंजेक्शन के लिए प्रवण होता है। –

उत्तर

2

आप गतिशील LINQ उपयोग कर सकते हैं (ScottGu's Article)

तो आप आसानी से बना सकते हैं अपने जहां स्ट्रिंग में और उसके बाद खंड कहाँ विधि करने के लिए इसे पारित:

public string GetWhereClause() 
{ 
string whereClause = ""; 
.... 
return whereClause 
} 

var logs = context.Logs.Where(GetWhereClause()); 

आशा इस मदद करता है;)

+2

मेरे द्वारा प्रदान किए गए कोड की तुलना करें, आपको लगता है कि आप किस तरह से अधिक कुशल हैं? – silent

5

हाँ, मुझे लगता है कि यह कुशल है। वास्तव में इस कोड द्वारा कोई प्रश्न नहीं किया जाएगा, क्योंकि यह 'लॉग' से कुछ भी पढ़ने की कोशिश नहीं करता है। जब ऐसा होता है, तो यह दोनों शर्तों को एक ही प्रश्न में खाते में लेना चाहिए (यानी जहां एक खंड है जिसमें दोनों स्थितियां शामिल हैं)।

लेकिन यदि आप LINQ का उपयोग कर रहे हैं और दक्षता के बारे में चिंतित हैं, तो आपको वास्तव में कौन से प्रश्नों को चलाने के लिए टूल का उपयोग करके लिखने के लिए आपको जो कुछ भी लिखना है, उसे जांचना होगा। आप SQL सर्वर प्रोफाइलर का उपयोग कर ऐसा कर सकते हैं।

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