2016-02-22 6 views
10

कहा जाता है क्या इससे कोई फर्क पड़ता है कि एंटिटी फ्रेमवर्क क्वेरी लिखते समय AsNoTracking विधि कहां से बुलाया जाता है? जैसेक्या इससे कोई फर्क पड़ता है कि एंटिटी फ्रेमवर्क में AsNoTracking को

var matchingCustomers = context.Customers.AsNoTracking().Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList(); 
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").AsNoTracking().Skip(50).Take(100).OrderBy(n => n.Name).ToList(); 
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).AsNoTracking().Take(100).OrderBy(n => n.Name).ToList(); 
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).AsNoTracking().OrderBy(n => n.Name).ToList(); 
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).AsNoTracking().ToList(); 
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList().AsNoTracking(); 

मैं बयान के अंत में जोड़ने से पसंद लेकिन ToList से पहले इस तरह कहा जाता है:

var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).AsNoTracking().ToList(); 

उत्तर

10

यह कोई फर्क नहीं पड़ता नहीं करता है: (source)

के साथ एक नई क्वेरी NoTracking लागू नहीं है, या स्रोत क्वेरी अगर NoTracking समर्थित नहीं है।

तो आप या तो शुरुआत में ऐसा करते हैं और आप विधि श्रृंखला के साथ "नई" क्वेरी का विस्तार करते हैं, या आप इसे अंत में करते हैं और फिर "नई" क्वेरी प्राप्त करते हैं। जब तक आप क्वेरी को निष्पादित करने से पहले पर कॉल करते हैं आप ठीक हैं।

+1

दरअसल यह आखिरी मामला में होता है - 'ToList' के बाद' AsNoTracking' को कॉल करना शायद फेंक देगा। यदि ऐसा नहीं होता है, तो यह वास्तव में नो-ऑप होगा क्योंकि 'AsNoTracking' को –

+2

@PanagiotisKanavos हां कहा जाता है, इसलिए मैं कहता हूं कि "क्वेरी को निष्पादित करने से पहले" कहता है।' ToList() 'क्वेरी निष्पादित करता है। मैंने इसे अभी बोल्ड में रखा है –

5

मुझे लगता है कि

var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList().AsNoTracking(); 

मामलों क्योंकि आप स्मृति में पहले से ही एक डेटा संरचना को NoTracking लागू करने के लिए एक बार एफई मार डाला गया है, और traked, क्वेरी कोशिश कर रहे हैं।

जब आप इस धाराप्रवाह API का उपयोग करते हैं; आप इसे निष्पादित किए बिना एक क्वेरी को परिभाषित कर रहे हैं, बेशक, क्वेरी निष्पादित करें। ToList() क्वेरी को निष्पादित करेगा जो डेटा को मेमोरी में List<T> डेटा संरचना में बदलने के लिए लाएगा।

के इस को समझने के लिए आदेश को विभाजित करते हैं:

  • context.Customers -> का चयन करें [*] ग्राहकों से
  • कहाँ (n => n.city == "मिलान") -> उन ग्राहकों से [*] चुनें जहां शहर == 'मिलान'
  • छोड़ें (50)। टेक (100) -> ग्राहकों से चुनें [*] जहां शहर == 'मिलान' ऑफ़सेट 50 पंक्तियां आगे 100 पंक्तियां केवल
  • ऑर्डरबी नाम -> ग्राहकों से चुनें [*] जहां शहर == 'मिलान' ऑफ़सेट 50 पंक्तियों का नाम अगली 100 पंक्तियों का नाम केवल
  • ToList() -> क्वेरी निष्पादित करें और डिफ़ॉल्ट रूप से ट्रैकिंग के साथ डेटा को स्मृति में लाएं!
  • AsNoTraking() -> कुछ भी नहीं है क्योंकि ईएफ ने पहले से ही क्वेरी निष्पादित की है और डेटा को ट्रैक किया है।
संबंधित मुद्दे

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