我有一个 LINQ 查询:
Dim result = DataContext.Items.Select(Function(p) New With {
.Category = If(p.Category IsNot Nothing, p.Category.Name, String.Empty)
.Name = p.Name
})
这适用于 SQL Server 2005,2008,2012 数据库。当我针对 SQL CE 4.0 DB 运行它时,我得到了这个异常:
异常详细信息:System.Data.SqlServerCe.SqlCeException:函数的指定参数值无效。[ 参数 # = 3,函数名称(如果已知)= case ]
我已将问题隔离到String.Empty
. 如果我""
直接使用,代码运行良好。如果我使用它也可以.Category = String.Empty
。MemberAccessExpression
似乎是SqlCe 如何处理If
MethodCallExpression
.
如果我取出.Category
线路,一切正常。在 LINQ to SQL CE 4 中进行空检查的正确方法是什么?我已经检查了Skeet 的答案,但我实际上想检查 DB 值,而不是我的值。我也看过这个答案,但它会将所有内容加载到内存中,这会破坏使用 LINQ 的目的。
升级到 EF 6 RC 后我仍然有例外(根据 ErikEJ 的建议)。这是一个堆栈跟踪:
at System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr)
at System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan()
at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options)
at System.Data.SqlServerCe.SqlCeCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Entity.SqlServerCompact.SqlCeMultiCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Entity.SqlServerCompact.SqlCeMultiCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<>c__DisplayClassb.<Reader>b__8()
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TInterceptionContext,TResult](Func`1 operation, TInterceptionContext interceptionContext, Action`1 executing, Action`1 executed)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext)
at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)