मैं एक सामान्य भंडार है कि एक IQueryable<T>
इस तरह उजागर करता है उपयोग कर रहा हूँ:मैं अपने सार भंडार के अंदर Linq2NHibernate के फ़ेच और .henFetch को कैसे लपेटूं?
public IQueryable<T> AllEntities
{
get
{
return session.Query<T>();
}
}
मैं इस तरह क्वेरी कर सकते हैं:
var results =
(from e in repository.AllEntities
where e.SomeProperty == "some value"
select e).ToList();
हालांकि, अगर T
एक माता पिता और दादा-दादी इकाई है और मैं चाहता हूँ उन्हें बेसब्री से लोड करते हैं, मैं यह करने के लिए है:
var results =
(from e in repository.AllEntities
where e.SomeProperty == "some value"
select e)
.Fetch(x => x.Parent)
.ThenFetch(x => x.Grandparent)
.ToList();
यह काम करता है, लेकिन .Fetch
और .ThenFetch
दोनों Linq2Nhibernate विशिष्ट एक्सटेंशन के तरीकों, जो दो कारण समस्याएं हो रही हैं:
मैं अपनी फ़ाइल के शीर्ष पर एक
using NHibernate.Linq;
बयान शामिल करने के लिए की है। हालांकि, इस बिंदु पर कि मैं यह प्रश्न कर रहा हूं, यह कार्यान्वयन अज्ञेयवादी होना चाहिए।मैं इकाई परीक्षण जब
IQueryable<T>
कि मेरी नकली भंडार प्रदान करता है के खिलाफ मार डाला इस,.Fetch
और.ThenFetch
तरीकों विफल करने का प्रयास करते।
मैं अपने IRepository<T>
इंटरफेस के इन अंदर कैसे लपेट कर सकते हैं, या कुछ सामान्य विस्तार के तरीकों के अंदर?
अद्यतन: मेरी NHibernate भंडार कार्यान्वयन के लिए
IQueryable<T> EagerLoadParent<U>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression);
IQueryable<T> EagerLoadParent<U, V>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression,
Expression<Func<U, V>> grandparentExpression);
... और इस:
अब तक सब मैं ले कर आए हैं मेरी भंडार इंटरफ़ेस में जोड़ने के लिए है
public IQueryable<T> EagerLoadParent<U>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression)
{
return query
.Fetch(parentExpression);
}
public IQueryable<T> EagerLoadParent<U, V>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression,
Expression<Func<U, V>> grandparentExpression)
{
return query
.Fetch(parentExpression)
.ThenFetch(grandparentExpression);
}
इस एपीआई के उपभोक्ता अब इस करता है:
var query =
(from e in repository.AllEntities
where e.SomeProperty == "some value"
select e);
var results = repository
.EagerLoadParent(query, e => e.Parent, p => p.Grandparent)
.ToList();
लेकिन इसमें अच्छा विस्तार विधि वाक्यविन्यास नहीं है जो मैं चाहूंगा। मैं .Fetch
और .ThenFetch
वाक्यविन्यास के करीब कुछ ढूंढ रहा हूं।
यह वास्तव में अच्छा है (मैं एक सहयोगी अपने आप की तुलना में कहीं अधिक कुशल को यह, क्रेडिट नहीं लिखा था), लेकिन अब मैं IFetchRequest कि वस्तुओं के लिए LINQ के साथ काम करता लागू करने के लिए की जरूरत है? – Sly
अंततः मुझे इसका समाधान मिला। धन्यवाद! – Chris
@Chris - क्या आप कृपया साझा करेंगे कि आपको कौन सा समाधान मिला? – Sam