Указанное приведение недействительно на linq

Я импортирую файл Excel в DataGridView, и мне нужно получить среднее значение для некоторого столбца. Все работает нормально, когда я пробую его на примере файла Excel, который составляет около 300 строк. Но когда я пробую его с настоящим файлом Excel с 41000 строками, я получаю сообщение об ошибке "указанное приведение неверно", когда я нажимаю кнопку, чтобы вычислить среднее значение. Я действительно не знаю, что случилось, и не знаю, как это решить. Вот код, который я использую, чтобы получить среднее значение, ошибка в столбцах, по которым я группирую.

private void Ave_Click(object sender, EventArgs e)
{
    BindingSource bindingSource1 = new BindingSource();
    bindingSource1.DataSource = (from r in dt.AsEnumerable()
                                 group r by new
                                 {
                                     RNCID = r.Field<Double?>("RNCID"),
                                     Date = r.Field<DateTime>("Date"),
                                     WBTSNAME = r.Field<String>("WBTSNAME")

                                 } into g

                                 select new
                                 {
                                     g.Key.Date,
                                     g.Key.RNCID,
                                     g.Key.WBTSNAME,
                                     VSLCDLMeanLicenseGroupShare = g.Average(r => r.Field<Double>("VS LC DLMean LicenseGroup Share")),
                                     VSLCDLCreditAvailableShared = g.Average(r => r.Field<Double>("VS LC DLCreditAvailable Shared")),
                                     VSLCULMeanLicenseGroupShare = g.Average(r => r.Field<Double>("VS LC ULMean LicenseGroup Share")),
                                     VSLCULCreditAvailableShared = g.Average(r => r.Field<Double>("VS LC ULCreditAvailable Shared")),
                                     UtilDL = g.Average(r => r.Field<Double?>("Util DL")),
                                     UtilUL = g.Average(r => r.Field<Double?>("Util UL")),

                                 });

    dataGridView1.DataSource = bindingSource1;
}

вот след стека, который я получил

System.InvalidCastException was unhandled

Сообщение = "Указанное приведение недействительно." Source="System.Data.DataSetExtensions" StackTrace: в System.Data.DataRowExtensions.UnboxT1.NullableField[TElem](Object value) at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) at CE_Fin.Form1.<Ave_Click>b__0(DataRow r) in C:\Users\Administrator\Documents\Visual Studio 2008\Projects\Final\CE_Fin\Form1.cs:line 215 at System.Linq.Lookup2.Create [TSource] (IEnumerable1 source, Func2 keySelector, Func2 elementSelector, IEqualityComparer1 для сравнения) в System.Linq.GroupedEnumerable3.GetEnumerator() at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext () в System.Windows.Forms.BindingSource.GetListFromEnumerable(IEnumerable enumerable) в System.Windows.Forms.BindingSource.ResetList() в System.Windows.Forms.BindingSource.set_DataSource(значение объекта) в CE_Fin.Form1.Ave_Click(Отправитель объекта, EventArgs e) в C:\Users\ Администратор \Documents\Visual Studio 2008\Projects\Final\CE_Fin\Form1.cs: строка 214 в System.Windows.Forms.Control.OnClick(EventArgs e) в System.Windows.Forms.Button.OnClick(EventArgs e) в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) в System.Windows.Forms.Control.WmMouseUp(сообщение & m, кнопка MouseButtons, щелчки Int32) в System.Windows.Forms.Control.WndProc(Message& m) в System.Windows.Forms.ButtonBase.WndProc(Message& m) в System.Windows.Forms.Button.WndProc(Message& m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Сообщение & m) в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods., Int32 pvLoopData) в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(причина Int32, контекст ApplicationContext) в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(причина Int32, контекст ApplicationContext) в System.Windows.FormsApp..Run(форма mainForm) в CE_Fin.Program.Main() в C:\Users\ Администратор \Documents\Visual Studio 2008\Projects\Final\CE_Fin\Program.cs: строка 18 в System.AppDomain._nExecuteAssembly(сборка сборки, String[] args) в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() в System.Threading.ThreadHelper.ThreadStart_Context(состояние объекта) em.Threading.ExecutionContext.Run(ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ThreadHelper.ThreadStart() InnerException:

1 ответ

Вероятная причина в том, что одно из этих полей имеет нулевое значение:

r.Field<Double>("VS LC DLMean LicenseGroup Share")
r.Field<Double>("VS LC DLCreditAvailable Shared")
r.Field<Double>("VS LC ULMean LicenseGroup Share")
r.Field<Double>("VS LC ULCreditAvailable Shared")

Сделать их обнуляемыми <double?> (как вы уже делаете для "Util DL" а также "Util UL")

Другие вопросы по тегам