मान लीजिए मैं एक इकाई वस्तुइकाइयों के अभिव्यक्ति के लिए Linq पुनर्प्रयोग <चयन में समारोह <T, TResult> और कहाँ
public partial class Article
{
public Id
{
get;
set;
}
public Text
{
get;
set;
}
public UserId
{
get;
set;
}
}
एक लेख के कुछ गुणों के आधार पर के रूप में परिभाषित किया है कहता है, मैं निर्धारित करने के लिए करता है, तो लेख हटाया जा सकता है की जरूरत है किसी दिए गए उपयोगकर्ता द्वारा। इसलिए मैं जांच करने के लिए एक स्थिर विधि जोड़ता हूं। की तरह कुछ:
public partial class Article
{
public static Expression<Func<Article, bool>> CanBeDeletedBy(int userId)
{
//Add logic to be reused here
return a => a.UserId == userId;
}
}
तो अब मैं
using(MyEntities e = new MyEntities())
{
//get the current user id
int currentUserId = 0;
e.Articles.Where(Article.CanBeDeletedBy(currentUserid));
}
अब तक तो अच्छा कर सकते हैं। अब मैं CanBeDeletedBy में तर्क का पुन: उपयोग करने के लिए एक का चयन करें, की तरह कुछ कर रही है, जबकि हैं:
using(MyEntities e = new MyEntities())
{
//get the current user id
int currentUserId = 0;
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = ???
};
}
लेकिन कोई फर्क नहीं पड़ता कि मैं क्या करने की कोशिश, मैं चयन विधि में अभिव्यक्ति का उपयोग नहीं कर सकते। मुझे लगता है कि यह है कि मैं
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = a => a.UserId == userId
};
कर सकते हैं तो मैं एक ही अभिव्यक्ति का उपयोग करने के लिए सक्षम होना चाहिए। अभिव्यक्ति को संकलित करने और
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = Article.CanBeDeletedBy(currentUserId).Compile()(a)
};
करके इसे कॉल करने का प्रयास किया गया लेकिन यह काम नहीं करेगा।
काम करने के लिए इसे कैसे प्राप्त करें इस पर कोई विचार? या यदि यह संभव नहीं है, तो दोनों जगहों पर व्यावसायिक तर्क का पुन: उपयोग करने के विकल्प क्या हैं?
धन्यवाद
पेड्रो
अभिव्यक्ति संकलन सही विकल्प है और यह संकलित करता है और मेरे लिए काम करता है। अगर यह मैं था, तो मैं संकलन को भी कारक बनाउंगा। आप क्या त्रुटि प्राप्त कर रहे हैं ? –
हां, यह ठीक संकलित करता है, लेकिन एक NotSupportedException अपवाद फेंकता है: "LINQ अभिव्यक्ति नोड प्रकार 'Invoke' LINQ से इकाइयों में समर्थित नहीं है।" एक फनक में चयन के बाहर अभिव्यक्ति को संकलित करने का प्रयास किया और उसी परिणाम के साथ इसे अंदर उपयोग करें। –
Pedro
बीटीडब्ल्यू, अगर मैं एक सादा Func का उपयोग करता हूं, और इसका उपयोग करता हूं कहाँ विधि, फिर क्वेरी ग्राहक है, जो इच्छित उद्देश्य नहीं है पर निष्पादित किया जाएगा –
Pedro