2013-05-20 11 views
5

Próbuję dokonać porównania obiektu MySqlDateTime z innym obiektem MySqlDateTime, każdy z dwóch różnych tabel. Staram się robić wszystko to wewnątrz kwerendy LINQ, ex:MySqlDateTime w kwerendzie LINQ

 var prodRowFindQuery = 
      from x in production.AsEnumerable() 
      where x.Field<MySqlDateTime>("date") == row.Field<MySqlDateTime>("date") && 
        x.Field<String>("device_id3") == row.Field<String>("device_id3") 
      select x; 

To daje mi błąd kompilatora:

operator '==' nie mogą być stosowane do operandy typu „MySql.Data .Types.MySqlDateTime”i 'MySql.Data.Types.MySqlDateTime'

Więc próbuję to:

 var prodRowFindQuery = 
      from x in production.AsEnumerable() 
      where x.Field<MySqlDateTime>("date").ToString() == row.Field<MySqlDateTime>("date").ToString() && 
        x.Field<String>("device_id3") == row.Field<String>("device_id3") 
      select x; 

teraz kompiluje, ale dostaję e run-time rror:

Określona obsada jest nieprawidłowa.

stosu Ślad:

IthacaDbTransferUtil.exe!IthacaDbTransferUtil.DataTableComparer.CompareTables.AnonymousMethod__0(System.Data.DataRow x = {System.Data.DataRow}) Line 34 C# 
System.Core.dll!System.Linq.Enumerable.WhereEnumerableIterator<System.Data.DataRow>.MoveNext() + 0x9c bytes 
IthacaDbTransferUtil.exe!IthacaDbTransferUtil.DataTableComparer.CompareTables(System.Data.DataTable aggregate = {System.Data.DataTable}, System.Data.DataTable production = {System.Data.DataTable}) Line 39 + 0x8b bytes C# 
IthacaDbTransferUtil.exe!IthacaDbTransferUtil.DbTransferWindowViewModel.CopyTestReliability() Line 177 + 0x94 bytes C# 
IthacaDbTransferUtil.exe!IthacaDbTransferUtil.DelegateCommand.Execute() Line 78 + 0x1f bytes C# 
IthacaDbTransferUtil.exe!IthacaDbTransferUtil.DelegateCommand.System.Windows.Input.ICommand.Execute(object parameter = null) Line 158 + 0xa bytes C# 
PresentationFramework.dll!System.Windows.Controls.Button.OnClick() + 0xaf bytes 
PresentationFramework.dll!System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs e) + 0x117 bytes  
PresentationCore.dll!System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate handler, object target) + 0x56 bytes  
PresentationCore.dll!System.Windows.EventRoute.InvokeHandlersImpl(object source, System.Windows.RoutedEventArgs args, bool reRaised) + 0x270 bytes  
PresentationCore.dll!System.Windows.UIElement.ReRaiseEventAs(System.Windows.DependencyObject sender = {System.Windows.Controls.Button}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}, System.Windows.RoutedEvent newEvent) + 0x183 bytes  
PresentationCore.dll!System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate handler, object target) + 0x56 bytes  
PresentationCore.dll!System.Windows.EventRoute.InvokeHandlersImpl(object source, System.Windows.RoutedEventArgs args, bool reRaised) + 0x270 bytes  
PresentationCore.dll!System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject sender = {System.Windows.Controls.Button}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}) + 0x14e bytes 
PresentationCore.dll!System.Windows.UIElement.RaiseTrustedEvent(System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}) + 0x64 bytes 
PresentationCore.dll!System.Windows.Input.InputManager.ProcessStagingArea() + 0x431 bytes  
PresentationCore.dll!System.Windows.Input.InputProviderSite.ReportInput(System.Windows.Input.InputReport inputReport) + 0xfd bytes  
PresentationCore.dll!System.Windows.Interop.HwndMouseInputProvider.ReportInput(System.IntPtr hwnd, System.Windows.Input.InputMode mode, int timestamp, System.Windows.Input.RawMouseActions actions, int x, int y, int wheel) + 0x410 bytes 
PresentationCore.dll!System.Windows.Interop.HwndMouseInputProvider.FilterMessage(System.IntPtr hwnd = 396436, MS.Internal.Interop.WindowMessage msg = WM_LBUTTONUP, System.IntPtr wParam = 0, System.IntPtr lParam = 34472260, ref bool handled = false) + 0x388 bytes  
PresentationCore.dll!System.Windows.Interop.HwndSource.InputFilterMessage(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled) + 0x7c bytes 
WindowsBase.dll!MS.Win32.HwndWrapper.WndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled) + 0x14a bytes  
WindowsBase.dll!MS.Win32.HwndSubclass.DispatcherCallbackOperation(object o) + 0x80 bytes  
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate callback, object args, int numArgs) + 0x5e bytes 
WindowsBase.dll!MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(object source = {System.Windows.Threading.Dispatcher}, System.Delegate method, object args, int numArgs, System.Delegate catchHandler = null) + 0x47 bytes 
WindowsBase.dll!System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority priority, System.TimeSpan timeout, System.Delegate method, object args, int numArgs) + 0x2bc bytes 
WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam) + 0x140 bytes  
[Native to Managed Transition]  
[Managed to Native Transition]  
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame) + 0x112 bytes 
PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window window) + 0x17a bytes  
PresentationFramework.dll!System.Windows.Application.Run() + 0x67 bytes 
IthacaDbTransferUtil.exe!IthacaDbTransferUtil.App.Main() + 0x77 bytes C# 
[Native to Managed Transition]  
[Managed to Native Transition]  
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x5a bytes  
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0x285 bytes 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0x9 bytes  
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x57 bytes  
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x51 bytes  
[Native to Managed Transition]  

Innym przykładem Próbowałem:

  var prodRowFindQuery = 
       from x in production.AsEnumerable() 
       where Convert.ToDateTime(x.Field<MySqlDateTime>("date")) == Convert.ToDateTime(row.Field<MySqlDateTime>("date")) && 
         x.Field<String>("device_id3") == row.Field<String>("device_id3") 
       select x; 

Wciąż podnosi błąd czasu wykonywania:

Określony oddanych nie jest prawidłowy.

Inny przykład:

  var prodRowFindQuery = 
       from x in production.AsEnumerable() 
       where x.Field<DateTime>("date") == row.Field<DateTime>("date") && 
         x.Field<String>("device_id3") == row.Field<String>("device_id3") 
       select x; 

sam błąd run-time:

Określony oddanych nie jest prawidłowy.

Ktoś powiedział coś o "data" nie jest rodzajem MySqlDateTime, dla zabawy, oto dowód, że jest to:

  var prodRowFindQuery = 
       from x in production.AsEnumerable() 
       where x.Field<String>("date") == row.Field<String>("date") && 
         x.Field<String>("device_id3") == row.Field<String>("device_id3") 
       select x; 

wyjątek Run-time:

Nie można rzutować obiektu wpisz "MySql.Data.Types.MySqlDateTime", aby wpisać "System.String".

Próbowałem kilku innych rzeczy i nic nie działa dla mnie.

Każda pomoc będzie mile widziana,

Pozdrawiam,

Kyle

+0

Dodaj ślad stosu do otrzymanego wyjątku. –

+0

Monitorowanie stosu Dodano – kformeck

+0

. Funkcja TotString() może nie być obsługiwana bez operandów formatu. czy próbowałeś .Equals()? –

Odpowiedz

0

W końcu rozwiązałem ten problem.

W pseudo kod, oto jak to zrobiłem:

  1. utworzyć dwa nowe DataTables
  2. zrobić wybierz z jednej DataTable, przyciągając wszystkich danych potrzebnych do stołu
  3. klonu tabela w ten sposób:

    officialTable = temporaryTable.Clone(); 
    
  4. cast kolumny w ten sposób:

    officialTable.Columns["date"].DataType = typeof(String); 
    
  5. albo iterują po wierszach tabeli, kopiując jeden wiersz do drugiego; LUB wykonaj inną wybraną instrukcję, aby odzyskać wszystkie dane, ale tym razem kolumna "dane" zostanie automatycznie przeniesiona do zamiast.

  6. wyrzucać starego DataTable

mam nadzieję, że to pomoże ktoś inny się.

0

Najwyższe prawdopodobieństwo jest, że pole DataRow"date" nie jest typu MySqlDateTime lub "device_id3" pole nie jest typu string .

+0

Oto trochę więcej informacji, które mogą pomóc: Wiem na pewno, że "device_id3" jest zdecydowanie ciągiem. Co do daty, nie jestem całkowicie pewny. Zawsze otrzymuję błędy odlewania MySqlDateTime, które uważam za nieparzyste, ponieważ kiedy wyszukuję tę kolumnę, mówię "CAST (data jako CHAR (50)) AS data", aby rzucić pole DateTime do pola łańcucha, zanim dotrze ono do .NET. – kformeck

0

Jeśli nie zdefiniowano operatora równości dla MySQLDateTime, można go zdefiniować samodzielnie lub przekonwertować go do standardowego obiektu datetime .NET przed wykonaniem porównań.

+0

zobacz nowe przykłady kodu, które zamieściłem po ślad stosu w oryginalnym poście. Jak pomyślnie przekonwertować z MySqlDateTime do System.DateTime wewnątrz kwerendy LINQ? – kformeck

Powiązane problemy