2011-06-17 26 views
0

我從LINQ2SQL類繼承的基類抽象類運行LINQ查詢時遇到了一些問題。從抽象類繼承的LINQ查詢對LINQ2SQL/WCF類的異常

[DataContract] 
public abstract class AbstractClass 
{ 
    [DataMember] 
    public abstract int Foo { get; set; } 
} 


// LINQ2SQL class. 
[DataContract] 
public class ConcreteClass : AbstractClass 
{ 
    [DataMember] 
    public override int Foo { ... } 
} 

當我嘗試對我的具體類運行LINQ查詢時,會發生此問題。我得到一個SystemException,說:「類成員AbstractClass.Foo未映射。」查詢看起來像以下:

// Sample LINQ query. 
result = from c in dataContext.ConcreteClasses where c.Foo == 42 select c; 

注意查詢是如何對CocnreteClass,但錯誤是在抽象類。任何想法這裏發生了什麼?

回答

0

它看起來像編譯器有推理正確類型的問題。不是使用LINQ2SQL上下文返回的類,而是使用基類,所以我不得不明確地將其轉換爲正確的類型。

這前面的例子不工作:

result = from c in dataContext.ConcreteClasses where c.Foo == 42 select c; 

這個例子不工作:

result = from c in dataContext.ConcreteClasses where ((ConcreteClass)c).Foo == 42 select c; 

奇怪,但它的工作原理。讚揚任何人可以弄清楚爲什麼會這樣做。

(參考:Very strange inheritance behavior.

0

您的抽象類是否有構造函數?我想我以前有過類似的東西,並且向抽象類添加受保護的構造函數似乎已經修復了它。

+0

HRM,我相信,編譯器會自動生成一個參數的構造函數。無論如何,我試着根據你的建議添加一個非抽象的受保護的構造函數,但它並沒有幫助。 –

0

您的抽象類和具體類是使用Table-Per-Type繼承還是其他一些以數據爲中心的繼承的LINQ2SQL類?我知道當你通過WCF傳遞EF類時,出於某種原因,它們失去了繼承信息。

+0

查詢實際發生在服務器端,所以我不認爲它會丟失任何信息。 –