2008-10-01 13 views
6

मैं कुछ LINQ संस्थाओं है कि कुछ इस तरह के वारिस है:LinqToSql और अमूर्त आधार वर्ग

public abstract class EntityBase { public int Identifier { get; } } 

public interface IDeviceEntity { int DeviceId { get; set; } } 

public abstract class DeviceEntityBase : EntityBase, IDeviceEntity 
{ 
    public abstract int DeviceId { get; set; } 
} 

public partial class ActualLinqGeneratedEntity : DeviceEntityBase 
{ 
} 

एक सामान्य विधि में मैं के साथ DeviceEnityBase व्युत्पन्न संस्थाओं से क्वेरी कर रहा हूँ:

return unitOfWork.GetRepository<TEntity>().FindOne(x => x.DeviceId == evt.DeviceId); 

जहां TEntity एक contraint है यह एक डिवाइस एंटीटीबेस है। यह क्वेरी हमेशा "अमान्य ऑपरेशन अपवाद" के साथ "क्लास सदस्य DeviceEntityBase.DeviceId असमर्थित" संदेश के साथ विफल रही है। यहां तक ​​कि अगर मैं

[Column(Storage = "_DeviceId", DbType = "Int", Name = "DeviceId", IsDbGenerated = false, UpdateCheck = UpdateCheck.Never)] 

उत्तर

4

LINQ करने वाली एसक्यूएल एक discriminator (here, here) के माध्यम से विरासत के लिए कुछ समर्थन हासिल है, लेकिन आप केवल कि में परिभाषित कर रहे हैं वर्गों पर क्वेरी कर सकता है LINQ मॉडल - यानी डेटा कक्षाएं स्वयं, और (शायद इस उदाहरण के लिए महत्वपूर्ण रूप से) क्वेरी स्वयं डेटा कक्षाओं के संदर्भ में phrased किया जाना चाहिए: हालांकि TENTITY एक डेटा वर्ग है, यह जानता है कि यहां संपत्ति इकाई आधार पर घोषित की गई है।

एक विकल्प गतिशील भाव हो सकता है; यह वर्गों ने स्वयं संपत्ति घोषित की (यानी आधार वर्ग खोना, लेकिन इंटरफेस रखना) - लेकिन यह मामूली नहीं है।

अभिव्यक्ति काम नीचे की तरह कुछ हो सकता है, यह देखते हुए कि आप या तो एक तर्क के रूप स्ट्रिंग में पारित, या प्रतिबिंब के माध्यम से प्राथमिक कुंजी प्राप्त (अगर यह जिम्मेदार ठहराया है) करने के लिए चाहते हो सकता है:

static Expression<Func<T, bool>> BuildWhere<T>(int deviceId) { 
    var id = Expression.Constant(deviceId, typeof(int)); 
    var arg = Expression.Parameter(typeof(T), "x"); 
    var prop = Expression.Property(arg, "DeviceId"); 
    return Expression.Lambda<Func<T, bool>>(
     Expression.Equal(prop, id), arg); 
} 
1

साथ सार आधार वर्ग में कुछ मानचित्रण जानकारी जोड़ने heirarchial मानचित्रण इस तरह की LinqToSql के साथ संभव isnot। मानचित्रण सेटअप है यह आधार वर्गों में गुणों के लिए मानचित्र नहीं कर सकता है। मैं कुछ महीनों के लिए इस पर चारों ओर चला गया जब यह पहली बार बाहर आया था। सबसे अच्छा समाधान इकाई ढांचे का उपयोग करना है। यह आपको अपने ऑब्जेक्ट मॉडल बनाने के साथ और अधिक लचीलापन देता है। यह आपको वही करने की अनुमति देगा जो आप यहां करने की कोशिश कर रहे हैं।

यहाँ इकाई की रूपरेखा के बारे में कुछ जानकारी है: MSDN Article

5

वाह , एक बार ऐसा लगता है कि मैं एक बार @MarcGravell को सक्षम कर सकता हूं!

मैं एक ही समस्या थी, तो मैं this answer, जो मेरे लिए समस्या हल की खोज!

आपके मामले में, आप कह सकते हैं कि:

return unitOfWork.GetRepository<TEntity>().Select(x => x).FindOne(x => x.DeviceId == evt.DeviceId); 

और बलबीर के अपने चाचा!

+1

@Lijo - मुझे लगता है कि Ladislav का जवाब एक अच्छा एक ... –

+0

धन्यवाद है। लेकिन यह "एक इंटरफेस के लिए प्रोग्रामिंग" नहीं होगा, है ना? बाद http://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspx में स्कॉट से एक टिप्पणी है - "जोड़ें आपके LINQ से SQL डेटा मॉडल कक्षाओं के इंटरफेस। LINQ से SQL कक्षाएं आंशिक कक्षाएं हैं - जिसका अर्थ है कि आप सीधे उन्हें इंटरफ़ेस जोड़ सकते हैं। " यह सुझाव हमारे परिदृश्य में काम नहीं करता है। क्या यह काम करने का कोई तरीका है? – Lijo

संबंधित मुद्दे