C# 查询列表时OleDb未处理的异常

C# 查询列表时OleDb未处理的异常,c#,sql,linq,linq-to-sql,C#,Sql,Linq,Linq To Sql,如果我直接在SQL数据库上运行下面的查询,它就会工作 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))

如果我直接在SQL数据库上运行下面的查询,它就会工作

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异常

我假设这可能是转换中使用CASE-WHEN语句的原因,但如果复制查询,则不存在CASE-WHEN语句

Linq查询


我的猜测是,通过OLEDB访问的任何数据源都不支持case语句

Linq查询被翻译成SQL,其中包含一个WHEN关键字,可能是CASE语句的一部分,但OLEDB可以用于包装所有类型的数据源,并且并非所有数据源都支持这种构造


如果要访问SQL Server、MySQL、Oracle或其他主要数据库系统,则应为该系统使用适当的ADO.NET提供程序,而不是OLEDB。如果您正在访问其他数据源,例如Excel,那么您可能运气不好。如果您可以找到向数据源发出了什么SQL,那么这可能会为解决此问题提供更多信息。

我也假设了同样的情况,但是当我查看linq语句的SQL查询部分时,绝对没有使用SQL语句的情况!!OLEDB提供者是否可以进一步翻译和修改SQL,以包含CASE语句?您正在访问哪个数据库/数据源?我正在使用Microsoft.ACE.OLEDB.12.0驱动程序访问MS Access数据库
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
   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)
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)