0

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 DB に対して正常に機能します。SQL CE 4.0 DB に対して実行すると、次の例外が発生します。

例外の詳細: System.Data.SqlServerCe.SqlCeException: 関数に指定された引数の値が無効です。[ 引数 # = 3、関数名 (既知の場合) = ケース ]

問題を に切り分けましたString.Empty""直接使用すると、コードは正常に動作します。を使用しても機能します.Category = String.Empty。SqlCeMemberAccessExpressionが an 内のa を処理する方法のバグのようIf MethodCallExpressionです。

.Category回線を外すと、すべて正常に動作します。LINQ to SQL CE 4 で null チェックを行う正しい方法は何ですか? Skeet's answerを確認しましたが、実際には自分の値ではなく DB の値を確認したいのです。this answerも見ましたが、すべてをメモリにロードしてしまい、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)
4

1 に答える 1