मेरे पास एक IQueryable है जिसका एंटीटी फ्रेमवर्क 4 ऑब्जेक्ट्स मैं अपने डीटीओ समकक्षों को प्रोजेक्ट करना चाहता हूं। ऐसी एक वस्तु 'व्यक्ति' एक ईएफ 4 कक्षा है, और संबंधित पीओसीओ पर्सन एक कक्षा है जिसे मैंने परिभाषित किया है। मैं उनके बीच मैप करने के लिए ऑटोमैपर का उपयोग कर रहा हूं। हालांकि, जब मैं निम्नलिखित कोड का प्रयास करें:IQueryable Lambda प्रोजेक्शन सिंटेक्स
LINQ to Entities does not recognize the method 'TestSite.Models.PersonP Map[Person,PersonP](TestSite.DataLayer.Model.Person)' method, and this method cannot be translated into a store expression.
उचित वाक्य रचना Automapper का उपयोग कर एक IQueryable<PersonP>
प्रक्षेपण बनाने के लिए क्या है:
IQueryable<Person> originalModel = _repo.QueryAll();
IQueryable<PersonP> projection = originalModel.Select(e => Mapper.Map<Person, PersonP>(e));
प्रक्षेपण कार्यावधि में इस त्रुटि उत्पन्न करता है? धन्यवाद।
पीएस Automapper सही तरीके से कॉन्फ़िगर किया गया है - मैं इसे अन्य स्थानों में व्यक्ति और व्यक्ति के बीच आगे और पीछे बदलने के लिए उपयोग करता हूं, यानी Mapper.Map<Person, PersonP>(myPersonObject)
सही ढंग से PersonP
ऑब्जेक्ट देता है।
संपादित करें (अधिक कोड):
मैं एक Telerik ग्रिड को EF4 इकाई Pocos (PersonP) बाध्य करने के लिए एक सहायक समारोह के लिए इस का उपयोग कर रहा है - जो संस्थाओं खुद को क्रमानुसार नहीं होगा ठीक से बाद से वे परिपत्र शामिल संदर्भ (यानी नेविगेशन गुण)। मेरे कोड इस तरह दिखता है:
public static GridModel GetGridModel<TEntity, TPoco>(IRepository<TEntity> repo, GridState gridState) where TEntity : EntityObject
{
var originalModel = repo.QueryAll().ToGridModel(gridState);
var projection = originalModel.Select(e => Mapper.Map<TEntity, TPoco>(e));
return projection.ToGridModel(gridState); // applies filters, sorts, pages, etc...
}
.ToGridModel
विधि IQueryable
पर एक विस्तार विधि है और यह एक जटिल वस्तु जो मैं मज़बूती से पार्स नहीं कर सकता रिटर्न - तो यह मेरे मैं छानने मैं करने के बाद प्रदर्शन करने के लिए है का मानना है की ओर जाता है पीओसीओ को प्रक्षेपण किया।
अद्यतन 2:
public static GridModel GetGridModel2(IRepository<Client> repo, GridState gridState)
{
IQueryable<Client> originalModel = repo.QueryAll();
IQueryable<ClientP> projection = originalModel.Select(c => ClientToClientP(c));
return projection.ToGridModel(gridState);
}
private static ClientP ClientToClientP(Client c)
{
return new ClientP { Id = c.Id, FirstName = c.FirstName };
}
इस कोड को भी विफल रहता है जब प्रक्षेपण बनाने:
चीजों को आसान बनाने की कोशिश कर रहा, मैं इस तरह एक गैर सामान्य विधि बनाया है। मैंने देखा है कि IQueryable.Select() में एकाधिक अधिभार हैं: अभिव्यक्ति> उनमें से एक होना। क्या मैं इन अधिभारों में से किसी एक का उपयोग करके इस फ़ंक्शन/प्रतिनिधि कॉल का प्रतिनिधित्व कर सकता हूं?
यह ऑटोमैपर की बजाय नियमित विधि के साथ भी विफल रहता है। कृपया मेरी पोस्ट में UPDATED2 देखें। – Harper
अपडेट देखें। गैर-अभिव्यक्तियों का अनुवाद एसक्यूएल में नहीं किया जा सकता है। –
आपकी मदद के लिए धन्यवाद। आपका कोड काम करता है (विधि सिग में छोटे टाइपो को सही किया गया है) लेकिन जैसा कि आपने बताया है, ऑटोमैपर इस उद्देश्य के लिए अनुपयुक्त है और काम नहीं करता है। क्या आप तकनीकी कारणों की व्याख्या कर सकते हैं कि मैं एक ऑटोमैपर मैपिंग के लिए नए क्लाइंटपी {आईडी = ..} को प्रतिस्थापित क्यों नहीं कर सकता - क्योंकि दोनों क्लाइंट पी ऑब्जेक्ट लौटाते हैं? – Harper