SingleResult <myObject>.ToList или .Count генерирует исключение InvalidCastException - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть хранимая процедура GetTopRecords ().Sp возвращает первые 500 записей.

  1. Я перетащил sp из обозревателя серверов в конструктор LinqtoSql.
  2. Я изменил тип возвращаемого значения на Record
  3. В коде, который у меня есть:

    var x = myDataContext.GetTopRecords();
    var y = x.Count();
    var z = x.ToList();
    

любая из последних двух строк выше выдает InvalidCastException

тип x равен

System.Data.Linq.SqlClient.SqlProvider.SingleResult<Record>

Почему я получаю исключение?Что я делаю неправильно?Пожалуйста, помогите.

Ответы [ 5 ]

2 голосов
/ 06 апреля 2011

x - это не список, это отдельный элемент.Как отдельный элемент вы не можете преобразовать его в список из более чем одного элемента или сосчитать, сколько элементов у него есть.

Как вы говорите: «Я изменил тип возвращаемого значения на Запись».Почему ты это сделал?

0 голосов
/ 29 сентября 2011

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

0 голосов
/ 07 апреля 2011

Я думаю, что произошли изменения в схеме базы данных с тех пор, как были созданы классы linq to sql. поэтому существует несоответствие между таблицей базы данных и представляющим ее объектом linq to Sql. поэтому вызовы не выполняются, потому что .NET не может успешно привести от созданного объекта БД к объекту linq to sql

0 голосов
/ 07 апреля 2011

Хорошо, можете ли вы рассказать, что такое GetTopRecords (). Что он возвращает? Вам нужно количество верхних записей?

var x = i.ToList (); var y = x.Count (); тогда это будет разрешено, но когда вы используете tolist (), ToList выполняет итерацию запроса и создает экземпляр List <>, инициализированный со всеми результатами запроса. что то же самое для count (), потому что count также нужны все записи для выполнения подсчета. цель tolist - предварительно заполнить данные результатом.

0 голосов
/ 07 апреля 2011

Поскольку это L2S (Linq To SQL), я предполагаю, что он использует отложенную загрузку, что означает, что только при вызове Count или ToList, которые имеют немедленное выполнение, запрос выполняется.

При этом проблема должна быть связана с тем, что вы возвращаете из метода GetTopRecords, который не совместим с типом Record.

Вы должны использовать конструктор L2S, чтобы проверить,результат этого метода правильно сопоставлен с типом данных Record.Это означает, что Record должна быть сопоставленной таблицей L2S, а GetTopRecords должен возвращать данные из этой таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...