Не удается назначить Nullable <Int64> для Linq.Table.Max ()? - PullRequest
2 голосов
/ 10 октября 2011

В моей программе есть следующие две строки кода. Цель состоит в том, чтобы вернуть наибольшее число из поля Значение.

MyDataContext context = new MyDataContext();
long? id = (long?)context.MyTable.Max(x => x.Value);

Поле Значение - это поле bigint в таблице. Таблица также не может гарантировать, что она содержит строки, фактически это сценарий, который я сейчас тестирую. Я пытаюсь запустить это, когда MyTable не имеет строк.

Вторая строка возвращает недопустимое исключение операции.

Нулевое значение не может быть назначено члену с типом System.Int64, который является типом значения, не допускающим значения NULL.

Я пробовал это несколькими разными способами, но я не могу заставить это работать. Я, очевидно, не понимаю, что-то важное о обнуляемых типов в C #.

РЕДАКТИРОВАТЬ (решение):

Благодаря ответу Криса я смог найти реальную причину моей проблемы и решения. Оказывается, это было не так, что поле Value было нулевым, а потому что x внутри лямбда-выражения было пустой строкой. Поэтому я добавил проверку внутри лямбды, чтобы увидеть, был ли х нулевым, если нет, то я могу безопасно проверить, является ли значение ноль.

MyDataContext context = new MyDataContext();
long? id = context.MyTable.Max(x => x == null ? (long?)0 : (long?)x.Value);

1 Ответ

3 голосов
/ 10 октября 2011

Ваша максимальная функция пытается вернуть Int64.Перегрузка Max, которую вы используете, определяется здесь на MSDN .Вы увидите, что он принимает параметр Func<TSource, long> selector.Это ваше лямбда-выражение, которое говорит, что вы дадите ему TSource, и он вернет long (т.е. Int64).Ваша функция делает, когда x.Value имеет значение null, возвращающее нулевое значение, которое, конечно, недопустимо для Int64.

В этом случае вы должны иметь возможность использовать что-то вроде:

x=> x.Value!=null?x.Value:Int64.Minvalue

Это означает, что если x имеет значение, оно возвращает его, а в противном случае возвращает минимально возможное значение, которое когда-либо будет максимальным, только если all равно нулю.

Я должен отрицать, чтоэтот код не проверен, но должен дать вам правильную идею.

отредактировано : я изначально предполагал, что это длинное значение, допускающее обнуление, но оказалось, что есть перегрузки, которые поддерживают это, поэтому я теперь предполагаючто x не имеет значения nullable long, просто выглядит немного как один, если вы щурились в правильном направлении.

...