Указанное приведение недействительно на 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.Lookup
2.Create [TSource] (IEnumerable1 source, Func
2 keySelector, Func2 elementSelector, IEqualityComparer
1 для сравнения) в System.Linq.GroupedEnumerable3.GetEnumerator()
at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.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"
)