Унаследованные типы Linq2SQL и запрос OfType - PullRequest
1 голос
/ 27 марта 2009

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

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

Вызов этого работает отлично, и я вижу, что SQL генерируется правильно. Тип поддержки: DataQuery .

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

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

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

Есть какие-нибудь предложения, чтобы справиться с этим, не теряя IQueryable?

Спасибо

leppie

UPDATE:

Об ошибке теперь сообщили в MS. Подробнее здесь . Спасибо Марк!

Ответы [ 2 ]

2 голосов
/ 27 марта 2009

Подтверждено. Похоже, ошибка для меня; Вы должны войти в систему Connect . Команда исправляет ошибки LINQ-to-SQL , поэтому ее нельзя игнорировать. Сейчас используйте .ToList() и т. Д.

Пример кода:

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 голосов
/ 25 мая 2010

У меня была та же самая проблема (все еще не исправленные парни MS!).

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

...