2013-05-31 22 views
3

如果我在SQL數據庫上直接運行下面的查詢,它的工作原理OleDb的未處理的異常而查詢列表<T>

var result = 
    from log in db.DeviceLogs 
    let byId = 
     db.DeviceLogs.Where(item => item.UserId == log.UserId) 
    let first = 
     byId.First(item => item.LogDate == byId.Min(min => min.LogDate)) 
    where 
     log.Equals(first) || (log.LogDate - first.LogDate).Minutes > 5 
    select log; 

但是,如果我運行鍼對過濾列表失敗與OleDb Exception

var filteredDeviceLogs = db.DeviceLogs 
         .Where(s => s.LogDate.Value.Date >= StartDate.Date 
            && s.LogDate.Value.Date < EndDate.AddDays(1)); 

var result = 
     from log in filteredDeviceLogs 
     let byId = 
      db.DeviceLogs.Where(item => item.UserId == log.UserId) 
     let first = 
      byId.First(item => item.LogDate == byId.Min(min => min.LogDate)) 
     where 
      log.Equals(first) || (log.LogDate - first.LogDate).Minutes > 5 
     select log; 

bool status = result.Any(); //OleDb Unhandled Exception 

異常詳細信息: Unrecognized keyword WHEN.

堆棧跟蹤

at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) 
    at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.OleDb.OleDbCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.ExecuteReader() 
    at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) 
    at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) 

我想這可能是CASE的原因時,用於轉化的聲明,但如果我複製了查詢,沒有CASE WHEN語句

LINQ查詢

SELECT [t0].[DeviceLogId], [t0].[DownloadDate], [t0].[DeviceId], [t0].[UserId], [t0].[LogDate], [t0].[Direction], [t0].[AttDirection], [t0].[C1], [t0].[C2], [t0].[C3], [t0].[C4], [t0].[C5], [t0].[C6], [t0].[C7], [t0].[WorkCode] 
FROM [DeviceLogs] AS [t0] 
WHERE ((EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM (
     SELECT TOP (1) [t1].[DeviceLogId] 
     FROM [DeviceLogs] AS [t1] 
     WHERE ([t1].[LogDate] = ((
      SELECT MIN([t2].[LogDate]) 
      FROM [DeviceLogs] AS [t2] 
      WHERE [t2].[UserId] = [t0].[UserId] 
      ))) AND ([t1].[UserId] = [t0].[UserId]) 
     ) AS [t3] 
    WHERE [t0].[DeviceLogId] = [t3].[DeviceLogId] 
    )) OR ((CONVERT(Int,(CONVERT(BigInt,(CONVERT(BigInt,(((CONVERT(BigInt,DATEDIFF(DAY, (
    SELECT [t12].[LogDate] 
    FROM (
     SELECT TOP (1) [t10].[LogDate] 
     FROM [DeviceLogs] AS [t10] 
     WHERE ([t10].[LogDate] = ((
      SELECT MIN([t11].[LogDate]) 
      FROM [DeviceLogs] AS [t11] 
      WHERE [t11].[UserId] = [t0].[UserId] 
      ))) AND ([t10].[UserId] = [t0].[UserId]) 
     ) AS [t12] 
    ), [t0].[LogDate]))) * 86400000) + DATEDIFF(MILLISECOND, DATEADD(DAY, DATEDIFF(DAY, (
    SELECT [t12].[LogDate] 
    FROM (
     SELECT TOP (1) [t10].[LogDate] 
     FROM [DeviceLogs] AS [t10] 
     WHERE ([t10].[LogDate] = ((
      SELECT MIN([t11].[LogDate]) 
      FROM [DeviceLogs] AS [t11] 
      WHERE [t11].[UserId] = [t0].[UserId] 
      ))) AND ([t10].[UserId] = [t0].[UserId]) 
     ) AS [t12] 
    ), [t0].[LogDate]), (
    SELECT [t12].[LogDate] 
    FROM (
     SELECT TOP (1) [t10].[LogDate] 
     FROM [DeviceLogs] AS [t10] 
     WHERE ([t10].[LogDate] = ((
      SELECT MIN([t11].[LogDate]) 
      FROM [DeviceLogs] AS [t11] 
      WHERE [t11].[UserId] = [t0].[UserId] 
      ))) AND ([t10].[UserId] = [t0].[UserId]) 
     ) AS [t12] 
    )), [t0].[LogDate])) * 10000))/600000000)) % 60)) > @p0)) AND (CONVERT(DATE, [t0].[LogDate]) >= @p1) AND (CONVERT(DATE, [t0].[LogDate]) < @p2) 

回答

0

我的猜測是,無論數據來源要通過OLEDB訪問不支持case語句。

Linq查詢正被翻譯成SQL,其中包含WHEN關鍵字(大概是CASE語句的一部分),但OLEDB可用於包裝各種數據源,但並非所有類型的數據源都支持此類構造。

如果您正在訪問一個SQL Server,MySQL和Oracle或其他主流數據庫系統,那麼你應該使用適當的ADO.NET提供該系統,而不是OLEDB。如果您正在訪問其他數據源,例如Excel,那麼你可能會不走運。如果您可以找出正在向數據源發出的SQL,那麼可能會提供更多信息來解決此問題。

+0

我也認爲是相同的,但是當我看着LINQ語句的SQL查詢部分,是絕對沒有CASE WHEN語句! – Marshal

+0

OLEDB提供者是否可以進一步翻譯和修改SQL,以包含CASE語句?你正在訪問哪個數據庫/數據源? –

+0

我使用'Microsoft.ACE.OLEDB.12.0'驅動程序訪問MS Access數據庫 – Marshal