ОК, я подтвердил только эту проблему, когда я пытаюсь запросить первичный ключ, если для этого первичного ключа в сущности установлено значение "Автоматическое генерируемое значение" - но без этого, как я могу вставить? Извините, если это noob linq2sql, но я только начал работать с ним.
Как можно использовать Linq to Sql с выключенной опцией, но также иметь дескриптор db для pk? Мне бы очень хотелось, чтобы каждый раз, чтобы получить pk, я должен назначить...
Я надеюсь, что кто-то может мне помочь, я полностью не могу использовать linq для sql в одном из моих проектов, не совсем уверен, что делать... вот пример, эта строка генерирует исключение StackOverflow.
MyDataContext dc = new MyDataContext(ConnStr);
var obj = dc.MyDataTable.AsQueryable().SingleOrDefault(a => a.pkID == 4);
- Эта вторая строка генерирует исключение StackOverflow.
Вот еще один пример с использованием того же файла datacontext
var o = dc.MyDataTable.Take(1); <-- works fine
var abc = o.ToArray(); <-- unable to evaluate, debugger stops
Любые идеи, что я могу попробовать? Кажется, я отлично использую linq для sql в другом проекте в том же решении.
- ОБНОВЛЕНИЕ-- Я забыл упомянуть, что эта конкретная сущность "MyDataTable" имеет значение pk как "Auto Generated Value" - я установил эту причину. У меня есть sql, делающий автоматический приращение, и это столбец идентификаторов.
Как реализуется pkID? Какой-нибудь шанс это рекурсивно?
Это была ошибка, исправленная в LINQ 4.0
http://damieng.com/blog/2009/06/01/linq-to-sql-changes-in-net-40
Устойчивость запросов В настоящее время обнаруживает саморегуляцию IQueryable и не вызывает переполнение стека
В .NET 3.5 для решения проблемы: при использовании "Auto Generated Value" = True, вы должны установить "Delay Loaded" в False - в противном случае вы получите ошибку рекурсии.
Работа Take(1)
меня не удивляет, так как это ничего не выполняет (она отложена до тех пор, пока данные не будут итерации).
Это интересная проблема - не в последнюю очередь потому, что SingleOrDefault(x=>x.ID == id)
фактически другая обработка внутренне - она распознает это как первичный ключ поиск и проверка менеджера идентификаторов сначала.
РЕДАКТИРОВАТЬ. Как нестандартную вещь, попробуйте .Where(x=>x.ID == id).SingleOrDefault()
- в соответствии с ошибкой (предыдущая ссылка), это не использует трюк поиска идентичности до тех пор, пока не отправится 4.0.
Начну с удивления:
Ваш datatable слишком большой!
Изменить. Действительно ли MyDataTable является DataTable? Или это на самом деле таблица LINQ to SQL <... > ? Если это так, удалите AsQueryable().