2015-05-26 8 views
8
के रूप में विधि खोज

मैं अपने भंडार में इस है और यह अपेक्षा के अनुरूप काम करता है: 10 कॉलम, जहां मैं केवल 3 से बाहर की जरूरत है:Linq IQueryable

public virtual EntityClass GetById(int id) 
{ 
    return db.Set<EntityClass>().Find(id); 
} 

हालांकि, मैं या तो बहुत अधिक स्तंभ (उदाहरण के साथ कुछ तालिकाओं है उन्हें) या कुछ टेबल जहां मेरे पास बार-बार टेक्स्ट होता है, उन्हें लाने की आवश्यकता नहीं होती है।

मैं सोच रहा था कि प्राथमिक कुंजी द्वारा अभी भी खोज करने का कोई तरीका है लेकिन शायद IQueryable परिणाम प्राप्त हो रहा है? या कम से कम कुछ है कि मुझे इस तरह कुछ करने के लिए अनुमति दे सकता है:

var blah = myRepo.GetById(myId).Select(s => new {column 2, column 3, column 7}) 
+2

के रूप में प्राथमिक कुंजी (इस प्रकार ठीक एक इकाई लौटने) द्वारा खोजें लगता है - तुम क्यों एक 'IQueryAble' वापसी मान की आवश्यकता होगी? – ChriPf

+2

उद्देश्य से हारने के लिए IQueryable नहीं मिल रहा है? आमतौर पर डेटाबेस की यात्रा करने से बचने के लिए आमतौर पर उपयोग किया जाता है। आप यहां अनुकूलित करने की क्या कोशिश कर रहे हैं? – jjj

+1

'ढूँढें' थोड़ा सा विशेष है जिसमें ऑब्जेक्ट को खोजने के लिए डीबी (स्टोर) पर जाने से पहले यह पहले 'स्टेटमैनगर' में जांच करेगा, जिसका अर्थ है कि यह संभावित रूप से कैश किया गया है और सभी फ़ील्ड लौटाए जाने चाहिए। यदि आप इष्टतम एसक्यूएल (उदाहरण के लिए तालिका के बजाए एक संकीर्ण सूचकांक को हिट करना चाहते हैं), जहां एक चयन प्रक्षेपण के साथ उपयोग करें, या यदि आप 'ढूंढें' का उपयोग करना चाहते हैं, तो आपको पूरी इकाई को लाइट में मैन्युअल रूप से मैप करना होगा या एनन कक्षा (लेकिन वहां थोड़ा बिंदु लगता है, क्योंकि यह पूरी इकाई का पुन: उपयोग करने के लिए सस्ता होना चाहिए)। – StuartLC

उत्तर

0
var blah = myRepo.Where(s => s.Id == myId).Select(s => new {column 2, column 3, column 7}).FirstOrDefault(); 

आप कर सकते हैं आप का चयन में ईद शामिल करना चाहते हैं:

var blah = myRepo.Select(s => new {column 2, column 3, column 7}).FirstOrDefault(s => s.Id == myId); 
+0

माइकल, एस में FirstOrDefault केवल मुझे अज्ञात चयन में चुने गए आइटम तक पहुंच प्रदान करता है। यह मेरी आवश्यकता नहीं है। – WPalombini

+0

हालांकि कोशिश करने के लिए धन्यवाद जैसा कि मैंने लिखा है कि आप पहले व्यक्ति का उपयोग करते हैं यदि आप प्रक्षेपण में आईडी शामिल नहीं करते हैं और दूसरा यदि आपने किया। –

+0

हां, क्षमा करें, मैंने आपका जवाब दोबारा पढ़ा है। लेकिन इससे मुझे बाद में इसकी तुलना करने में सक्षम होने के लिए आईडी का चयन करने के लिए मजबूर किया जाएगा। वास्तव में मैं इसके बाद क्या नहीं हूं। – WPalombini

1

मैं किसी अन्य वर्ग पैदा करेगा जिसमें आपके इच्छित गुणों का सबसेट शामिल है। इस तरह यह हमेशा स्पष्ट किया जाना चाहिए कि क्या आप के साथ काम कर रहे हैं:

public EntityClassLite GetLiteById(int id) 
{ 
    return db.Set<EntityClass>() 
      .All 
      .Where(e => e.Id = id) 
      .Select(new EntityClassLite 
        { 
         Column2 = e.Column2 
         Column3 = e.Column3 
         Column7 = e.Column7 
        } 
      .FirstOrDefault() 
} 

तुम भी वंशानुक्रम का उपयोग के बारे में सोच सकता है:

public class EntityClass: EntityClassLite 
{ 
    public string Column1 {get; set;} 
    public string Column4 {get; set;} 
    public string Column5 {get; set;} 
    public string Column6 {get; set;} 
    public string Column8 {get; set;} 
    public string Column9 {get; set;} 
    public string Column10 {get; set;} 
} 

public class EntityClassLite 
{ 
    public int Id {get; set;} 
    public string Column2 {get; set;} 
    public string Column3 {get; set;} 
    public string Column7 {get; set;} 
} 

तो फिर आप अपने भंडार में एक अलग विधि हो सकता था

फिर आपके पास दो भंडार होंगे। EntityClass और EntityClassLite के लिए एक, प्रत्येक के पास Find विधि और प्रत्येक आपके लिए आवश्यक डेटा लौटा रहा है।

एक तरफ, मुझे ऐसी इकाई की कल्पना करना बहुत मुश्किल लगता है जिसमें ऐसे बड़े कॉलम हैं जो इसके एक उदाहरण को लेकर महत्वपूर्ण प्रदर्शन समस्याओं का कारण बनेंगे।

1

ठीक है, मुझे लगता है कि आप भंडार का उपयोग कर (आप एफई उपयोग कर रहे हैं) पर पुनर्विचार करेंगे और सेवा परत में अपने को लाते समय तर्कGetEmployeeById(int id) जैसे विशिष्ट विधि के अंदर जाना चाहिए।

और यदि आप इकाई फ्रेमवर्क के साथ भंडार का उपयोग कर रहे हैं तो क्या होता है इसके बारे में यहां एक उद्धरण दिया गया है।

आपने अपने डेटा तक पहुंचने के एक ब्लेंड, न्यूटर्ड, अक्षम तरीके के लिए अपनी डेटा स्टोरेज तकनीक की सभी सुविधाएं छोड़ दी हैं। - खालिद Abuhakmeh

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