2009-03-27 2 views
1

У меня есть настройка, где я использовал наследование Linq2SQL. Для того, чтобы сделать запросы проще, я разоблачить производные типы в DataContext, а также, как следующее:Linq2SQL унаследованные типы и запрос OfType

public IQueryable<Derived> Derivations 
{ 
    get { return Bases.OfType<Derived>(); } // filter list on type 
} 

Calling это работает отлично, и я могу видеть SQL быть правильно генерироваться. Тип поддержки - DataQuery <T>.

Проблема возникает, когда я назначаю этот IEnumerable источнику данных (либо элементу управления, либо BindingSource).

Из того, что я вижу, объект DataQuery запрашивается для IListSource. И это счастливо поставляет это. Затем он переходит к созданию BindingList, который терпит неудачу, поскольку параметр типа из 2 предоставленных аргументов (IEnumerable <Derived> и таблица <Base>) не соответствует. Это вызывает исключение MissingMethod, поскольку конструктор не может быть найден.

Простым решением является вызов ToList() на IQueryable < Производный > перед назначением источнику данных, а затем он работает, но это довольно утомительно.

Любые предложения по устранению этого без «потери» IQueryable?

Благодаря

leppie

UPDATE:

Исправлена ​​ошибка теперь сообщается MS. Подробнее here. Спасибо, Марк!

ответ

2

Подтверждено. Похож на меня; вы должны зарегистрировать его на Connect. Команда are fixing LINQ-to-SQL bugs, поэтому ее нельзя игнорировать. На данный момент, используйте .ToList() и т.д.

код примера: (! До сих пор не фиксированные парни MS)

using (var ctx = new MyDataContext()) 
{ 
    var qry = ctx.BaseEntities.OfType<DerivedEntity>(); 
    IListSource ls = (IListSource)qry; 
    IList list = ls.GetList(); // boom 
    /* Constructor on type 
     'System.Data.Linq.Provider.DataBindingList`1[snip]' 
     not found.*/ 
} 
+0

Спасибо :) Хе-хе, я прошел длинный маршрут расследования через рефлектор :) – leppie

+0

@leppie - увы, я уже очень хорошо знаком с маршрутом, который такие привязки берут ... –

0

Я имел такой же вопрос.

Чтобы сохранить IQueryable, я сделал .Cast<object>() при назначении источнику данных (я использую его для вывода файла xls из любой таблицы L2S, которую я хочу на веб-сайте DynamicData).

Смежные вопросы