पहले एंटीटी फ्रेमवर्क कोड का उपयोग करके बनाए गए एकाधिक तालिकाओं वाले डेटाबेस पर विचार करें। प्रत्येक तालिका में एक अलग प्रकार की वस्तु होती है, लेकिन मैं एक्स्टेंसिबिलिटी के लिए एक जेनेरिक क्वेरी बिल्डर क्लास बनाना चाहता हूं। अब तक इस वर्ग के लिए एक रूपरेखा के रूप में मैं के रूप में इतना एसक्यूएल को Linq के लिए एक आवरण के रूप में कार्य करने का इरादा एक सामान्य वर्ग है:सी # जेनेरिक लिंक क्वियर कैसे बनाएं?
public class DBQuerier<T>
where T : class
{
DbSet<T> relation;
public DBQuerier(DbSet<T> table)
{
relation = table;
}
public bool Exists(T toCheck);
public void Add(T toAdd);
public T (Get Dictionary<String, Object> fields);
public bool SubmitChanges();
public void Update(T toUpdate, Dictionary<String, Object> fields);
public void Delete(T toDelete);
}
मेरे समस्या पहले बाधा पर आता है जब अगर एक रिकार्ड मौजूद है देखने के लिए जाँच करने की कोशिश कर क्योंकि मैं सामान्य प्रकार टी और एक ऑब्जेक्ट प्रकार के बीच परिवर्तित नहीं कर सकता जिसे मैं काम करने की कोशिश कर रहा हूं।
public bool Exists(T toCheck)
{
return (from row in relation
where row.Equals(toCheck)
select row).Any();
}
एक रन-टाइम अपवाद तब होता है के रूप में एसक्यूएल कुछ भी लेकिन आदिम प्रकार के साथ काम नहीं कर सकते हैं, भले ही मैं IComparable
को लागू करने और अपने खुद के बराबर है कि एक ही क्षेत्र तुलना नामित: यदि मैं आधार Linq का उपयोग करें। लैम्ब्डा भाव करीब आने लगते हैं, लेकिन फिर मैं भले ही मेरी समझ गया था कि Expression.Equal
यह वर्ग 'तुलनीय समारोह का उपयोग करने के लिए मजबूर एसक्यूएल आदिम प्रकार की तुलना में अधिक को संभालने में सक्षम नहीं किया जा रहा के साथ फिर से समस्याओं मिलती है:
public bool Exists(T toCheck)
{
ParameterExpression T1 = Expression.Parameter(typeof(myType), "T1");
ParameterExpression T2 = Expression.Parameter(typeof(myType), "T2");
BinaryExpression compare = Expression.Equal(T1, T2);
Func<T, T, bool> checker =
Expression.Lambda<Func<T, T, bool>>
(compare, new ParameterExpression[] { T1, T2 }).Compile();
return relation.Where(r => checker.Invoke(r, toCheck)).Any();
}
अभिव्यक्ति पेड़ को दिमाग में डिजाइन किया गया था ताकि बाद में मैं उस प्रकार के अनुसार क्वेरी बनाने के लिए एक स्विच स्टेटमेंट जोड़ सकूं जिसे मैं देखने की कोशिश कर रहा था। मेरा प्रश्न है: क्या ऐसा करने के लिए एक बहुत ही सरल/बेहतर तरीका है (या जो मैंने अभी तक कोशिश की है उसे ठीक करें) क्योंकि केवल एक ही विकल्प जो मैं देख सकता हूं, प्रत्येक तालिका के लिए कक्षा लिखना है (विस्तारित करना आसान नहीं है) या प्रत्येक रिकॉर्ड एप्लिकेशन पक्ष की जांच करें (यदि आपको संपूर्ण डेटाबेस स्थानांतरित करना है तो संभावित रूप से धीमी गति से धीमा!)? क्षमा करें अगर मैंने बहुत ही बुनियादी गलतियां की हैं क्योंकि मैंने बहुत अधिक समय तक इस के साथ काम नहीं किया है, अग्रिम धन्यवाद!
नोट अपने 'Exists' विधि सिर्फ एक नाम दिया' एक कार्यान्वयन के रूप में अच्छा के बिना Contains' तरीका है। – Servy
आप एक प्राथमिक कुंजी स्तंभ तुम हमेशा यदि वह मौजूद है की जाँच करने के 'relation.Find (आईडी)' विधि का उपयोग कर सकते हैं। – Nilesh