针对从抽象类继承的LINQ2SQL/WCF类的LINQ查询出现异常
本文关键字:LINQ 类的 查询 异常 WCF 抽象类 继承 LINQ2SQL | 更新日期: 2023-09-27 17:59:30
我在运行从基本抽象类继承的LINQ2SQL类的LINQ查询时遇到一些问题。
[DataContract]
public abstract class AbstractClass
{
[DataMember]
public abstract int Foo { get; set; }
}
// LINQ2SQL class.
[DataContract]
public class ConcreteClass : AbstractClass
{
[DataMember]
public override int Foo { ... }
}
当我试图对我的Concrete类运行LINQ查询时,就会出现这个问题。我得到一个SystemException,上面写着:"Class成员AbstractClass.Foo未映射。"
// Sample LINQ query.
result = from c in dataContext.ConcreteClasses where c.Foo == 42 select c;
注意查询是如何针对CocnreteClass的,但错误在AbstractClass上。你知道这里发生了什么吗?
您的抽象类中有构造函数吗?我想我以前也遇到过类似的情况,在抽象类中添加一个受保护的构造函数似乎已经解决了这个问题
您的抽象类和具体类是使用"按类型表"继承还是其他以数据为中心的继承的LINQ2SQL类?我知道当您通过WCF传递EF类时,它们会因为某种原因丢失继承信息。
看起来编译器在推断正确的类型时遇到了问题。它不是使用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;
很奇怪,但它有效。投票给任何能弄清楚为什么会这样做的人。
(参考:非常奇怪的继承行为。)