Исключение в запросе LINQ для класса LINQ2SQL / WCF, который наследуется от абстрактного класса - PullRequest
0 голосов
/ 17 июня 2011

У меня возникли некоторые проблемы при выполнении запроса LINQ из класса LINQ2SQL, который наследуется от базового абстрактного класса.

[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, но ошибка в AbstractClass.Есть идеи, что здесь происходит?

Ответы [ 3 ]

0 голосов
/ 17 июня 2011

Используют ли ваши абстрактные и конкретные классы классы LINQ2SQL для наследования табличных типов или какого-либо другого ориентированного на данные наследования? Я знаю, что когда вы передаете классы EF через WCF, они по какой-то причине теряют информацию о наследовании.

0 голосов
/ 21 июня 2011

Похоже, что у компилятора возникли проблемы с выводом правильного типа. Вместо использования класса, возвращенного контекстом 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;

Странно, но это работает. Привет всем, кто может понять, почему он это делает.

(Ссылка: Очень странное поведение наследования. )

0 голосов
/ 17 июня 2011

Есть ли в вашем абстрактном классе конструктор? Я думаю, что раньше у меня было что-то похожее на это, и добавление защищенного конструктора к абстрактному классу, похоже, исправило это.

...