2009-06-26 9 views
8

ऐसा लगता है कि GetObjectKey को मौजूदा, तत्काल वस्तुओं, और फिर डेटा स्टोर की खोज करने का लाभ है। हालांकि, यह भी है कि आप मजबूत टाइपिंग के कुछ खो देते हैं, और अपने जिसके परिणामस्वरूप वस्तु कास्ट करने के लिए की जरूरत है लगता है:LINQ क्वेरी या GetObjectKey का उपयोग कर एकल इकाई फ्रेमवर्क इकाइयों को पुनर्प्राप्त करें?

int customerID = 1; 
Customer customer = (from c in context.Customers 
        where c.CustomerID = customerID 
        select c).FirstOrDefault(); 

निजी तौर पर

int customerID = 1; 
EntityKey key = new EntityKey("MyEntities.Customers", "CustomerID", customerID); 
Customer customer = context.GetObjectByKey(key) as Customer; 

बनाम LINQ

GetObjectKey, मैं उत्तरार्द्ध पसंद करते हैं टाइपिंग की वजह से विधि। साथ ही, आपके डीएएल सभी प्रश्नों के प्रश्नों के साथ काफी समान होंगे, हालांकि यह सिर्फ एक व्यक्तिगत वरीयता है।

आप लड़कों और लड़कियों का क्या उपयोग करते हैं?

+0

पूर्व विधि में मैं कलाकार के बजाय "as" कीवर्ड का उपयोग करूंगा। इस तरह यदि परिणाम शून्य है तो यह अपवाद नहीं फेंक देगा। चूंकि कीवर्ड मूल्य डालने का प्रयास करता है लेकिन यदि यह सही प्रकार नहीं है तो यह आपको बदले में देता है। तो आपके पास संदर्भ होगा। ग्राहक के रूप में GetObjectByKey (कुंजी); –

+0

अच्छा बिंदु। मैं थोड़ा सा स्कोर भी उदाहरण को संशोधित करूंगा। –

उत्तर

9

मैं बाद वाले को पसंद करता हूं क्योंकि यह स्पष्ट रूप से स्पष्ट है कि आप क्या चाहते हैं। EntityKey का उपयोग करके (और यह ऐसा कुछ है जिसे ADO.NET टीम समझ में नहीं आता है), हमें एंटीटी फ्रेमवर्क द्वारा हमारे द्वारा लगाई गई संरचना के आसपास काम करना होगा। दूसरे उदाहरण में जिस तरीके से आपने किया था, क्वेरी भाषा का उपयोग करके, हम उन सभी डेवलपर्स को बता रहे हैं जो कभी भी हमारे कोड को देखेंगे, हे, हम सिर्फ इस आईडी को इस आईडी के साथ चाहते हैं या हम शून्य चाहते हैं।

मुझे नहीं लगता कि सही होने के नाते (जैसा कि आप पहले उदाहरण में भी हैं) आपके सहकर्मियों को स्पष्ट नहीं होने का बहाना है। :)

1

मेरे समाधान में, मैं सामान्य प्रोग्रामिंग का उपयोग करता हूं। बेस रिपोजिटरी कक्षा में मेरे पास कोड है:

private string GetEnittySetName(string entityTypeName) 
{ 
    var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace); 
    string entitySetName = (from meta in container.BaseEntitySets 
          where meta.ElementType.Name == entityTypeName 
          select meta.Name).FirstOrDefault(); 
    return entitySetName; 
} 

private string entitySetName; 

protected string EntitySetName 
{ 
    get 
    { 
     if (string.IsNullOrEmpty(entitySetName)) 
     { 
      entitySetName = GetEnittySetName(typeof(T).Name); 
     } 
     return entitySetName; 
    } 
} 

public T SelectOne(Func<T, bool> exp) 
{ 
    return context.CreateQuery<T>(EntitySetName).Where(exp).FirstOrDefault(); 
} 
संबंधित मुद्दे