/ / मैं एक पुन: प्रयोज्य इकाई रूपरेखा प्रक्षेपण अभिव्यक्ति कैसे बना सकता हूं? - c #, .net, एंटिटी-फ्रेमवर्क, लिनक-टू-एंटिटीज़, एंटिटी-फ्रेमवर्क -6

मैं एक पुन: प्रयोज्य इकाई रूपरेखा प्रक्षेपण अभिव्यक्ति कैसे बना सकता हूं? - c #, .net, एंटिटी-फ्रेमवर्क, लिनक-टू-एंटिटीज़, एंटिटी-फ्रेमवर्क -6

मेरे डेटाबेस में दर्जनों कॉलम के साथ टेबल हैं:

Table MyEntity: int Id string Name string Email ...dozens of other columns I never use in this project

EF द्वारा उत्पन्न वर्ग में उन अतिरिक्त कॉलमों के गुण होते हैं, और एक साधारण क्वेरी उन सभी अतिरिक्त कॉलमों को बेकार कर देती है।

इसके बजाय, मैं एक पतली कक्षा रखना चाहता हूं, जैसे:

class MyEntity { public int Id; public string Name; public string Email; }

जब मैं प्रश्न करता हूं, मैं अपनी पतली वस्तु के उदाहरण बनाना चाहता हूं, और जाहिर है, मैं यह कर सकता हूं:

from x in MyEntity
select new MyEntity {Id = x.Id, Name = x.Name, Email = x.Email };

लेकिन मैं यह बहुत करता हूं, और हर बार गुणों को टाइप करने से बहुत थकाऊ (और त्रुटि प्रवण होता है, क्योंकि मैं एक भूल सकता है)।

इसलिए मैं इसके बजाय ऐसा कुछ करने की कोशिश कर रहा हूं:

from x in MyEntity
select x.ToLiteEntity();

लेकिन मुझे यकीन नहीं है कि कैसे लिखूं ToLiteEntity इतना है कि यह एक बनाता है अभिव्यक्ति जो क्वेरी में जोड़ा जाता है, ताकि यह डेटाबेस से केवल आवश्यक कॉलम का चयन करना जानता हो। मैं यह कैसे कर सकता हूँ?

उत्तर:

जवाब के लिए 2 № 1

आप इसे डेटाबेस के ऊपर एक लेयर में सार कर सकते हैं। जब आप अपनी "लाइट" ऑब्जेक्ट्स को पुनः प्राप्त करना चाहते हैं, तो एक अलग विधि को कॉल करें:

public IQueryable<MyEntity> GetLiteMyEntities(DbContext c, string Name) // your implementation of DbContext, not actually DbContext
{
return from me in c.MyEntity
select new MyEntity {Id = x.Id, Name = x.Name, Email = x.Email };
}

संपादित करें: यदि आपको अन्य क्षेत्रों पर फ़िल्टर करने की आवश्यकता है जिन्हें आप वापस नहीं करना चाहते हैं, तो आप पहले अपने फ़िल्टर क्वेरी की रचना कर सकते हैं, और फिर एक विधि का उपयोग कर सकते हैं जो लेता है एक IQueryable:

public IQueryable<MyEntity> GetLiteMyEntities(IQueryable<MyEntity> query)
{
return from me in query
select new MyEntity {Id = x.Id, Name = x.Name, Email = x.Email };
}

// build your filter first
from x in MyEntity
where x.someSpecialID == 42
select x;

// then pass it to get your lite object
var lite = GetLiteMyEntities(x);

और भी बेहतर, इसे एक विस्तार विधि बनाएँ:

public IQueryable<MyEntity> GetLiteMyEntities(this IQueryable<MyEntity> query)
{
return from me in query
select new MyEntity {Id = x.Id, Name = x.Name, Email = x.Email };
}

var lite = (from x in MyEntity
where x.someSpecialID == 42
select x).GetLiteMyEntities();

उत्तर № 2 के लिए 1

आप इस्तेमाल कर सकते हैं क्वेरी करने योग्य एक्सटेंशन AutoMapper से

द।ProjectTo () AutoMapper के मैपिंग इंजन को बताएगा इकाई को सूचित करने वाले IQueryable के लिए एक चुनिंदा खंड का उत्सर्जन करने के लिए फ्रेमवर्क जिसे केवल आइटम के नाम कॉलम को क्वेरी करने की आवश्यकता है टेबल, उसी तरह जैसे कि आपने मैन्युअल रूप से अपने IQueryable का अनुमान लगाया था एक चुनें खंड के साथ OrderLineDTO।