![]() |
Модераторы: gambit |
![]() ![]() ![]() |
|
BooteR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.1.2008 Где: Kyiv Репутация: нет Всего: нет |
Доброго времени суток. Скорее всего проблемма не с DefaultIfEmpty(), а с неумением им пользоваться. Гугл перерыл, ничего похожего не нашел, поэтому спрашиваю тут.
Есть несколько табличек в базе. После некоего запроса query получаем таблицу с полями MaterialID и Quantity. Тоесть айди материалла и его необходимое количество. В базе есть таблица Stock. Теперь нужно из query вычесть количество материалов, которое есть на складе. Пробую сделать это таким образом:
Проблемма в том, что если материала нет на складе, то нужно отнимать 0. Без DefaultIfEmpty() оператор First() выдает exception, потому что входящая последовательность пуста. А с DefaultIfEmpty(0) выдает exception " Unsupported overload used for query operator 'DefaultIfEmpty' " Как построить правильно запрос, чтобы небыло проблем когда запись об материале отсутствует в таблице Stock? Помогите, люди добрые! ![]() Наперед спасибо |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 5 Всего: 62 |
Попробуйте вместо метода DefaultIfEmpty (который не "замаплен" в LINQ To SQL) воспользоваться методом SingleOrDefault.
|
|||
|
||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 2 Всего: 38 |
Разовью идею Idsa.
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 5 Всего: 62 |
KelTron, что есть выражение "?? 0"?
|
|||
|
||||
KelTron |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 2 Всего: 38 |
Ну есть такой оператор в шарпе)
Ниже два эквивалентных куска кода:
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
||||
|
|||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 5 Всего: 62 |
KelTron, а зачем он здесь? SingleOrDefault, если не найдет запись, вернет 0.
|
|||
|
||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 2 Всего: 38 |
Хм, да, ты прав...как то не обратил внимания, что там не класс.
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 5 Всего: 62 |
Итого:
KelTron, спасибо за оператор ?? ![]() |
|||
|
||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 2 Всего: 38 |
На здоровье)
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
BooteR |
|
||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.1.2008 Где: Kyiv Репутация: нет Всего: нет |
Попробовал с SingleOrDefault():
Получил exception: "The null value cannot be assigned to a member with type System.Int32 which is a non-nullable value type" Причем вот это работает правильно:
В чем проблемма? Я вообще запутался :( |
||||
|
|||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 5 Всего: 62 |
BooteR, приведите схему таблицы Stock
|
|||
|
||||
BooteR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.1.2008 Где: Kyiv Репутация: нет Всего: нет |
||||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 5 Всего: 62 |
MaterialId, оказывается, не первичный ключ. Тогда не понимаю смысл этого запроса.
Исключение, видимо, вылетает из-за того, что dataContext.GetTable<Stock>().Where(n => n.MaterialID == t.MaterialID) содержит более одного элемента. Раз так, стоит заменить SingleOrDefault на FirstOrDefault. |
|||
|
||||
BooteR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.1.2008 Где: Kyiv Репутация: нет Всего: нет |
Я уже не помню почему я не сделал MaterialId первичным ключем, то двух записей с одинаковым MaterialId в таблице нет. Сделал MaterialId первичным ключем, выдает тот же exception. Заменил SingleOrDefault на FirstOrDefault, все та же проблема
![]() Почему же foreach работает нормально? |
|||
|
||||
BooteR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.1.2008 Где: Kyiv Репутация: нет Всего: нет |
Сделал так:
Некрасиво, но работает. А вообще странно как то... Всем спасибо за помощь! |
|||
|
||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 2 Всего: 38 |
Кажется я понял.
Т.к. внешний запрос отложенный => пока ты не начнёшь перечислять коллекцию он не выполнится и значит в поле a.MaterialID будет null. Вложенный запрос же НЕ отложенный и выполняется немедленно, но в это время ещё нет данных об a.MaterialID. Поэтому генерится эксепшин. По этой же причине работает вариант с foreach. Самое простое что приходит в голову для исправления ситуации:
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
BooteR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.1.2008 Где: Kyiv Репутация: нет Всего: нет |
KelTron, мне результат запроса нужно вывести в DataGridView. Решение с ToList(), как я понимаю, будет проблематично
|
|||
|
||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 2 Всего: 38 |
BooteR, не заметил твоего предыдущего сообщения.
Хм, что то странное, если у тебя n.Quantity это целое не нулевое число, то каким образом там получается null... Для этого случая как раз и подходит оператор ?? Предыдущий твой код можно написать так:
Что я и предлагал в самом начале... Действительно -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
BooteR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.1.2008 Где: Kyiv Репутация: нет Всего: нет |
KelTron, с оператором ?? я пробовал, но выдает ошибку:
Operator '??' cannot be applied to operands of type 'int' and 'int' |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |