2013-10-02 42 views
0

我有一個LINQ查詢:如何做一個LINQ空校驗,以實體SQL CE 4.0

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數據庫,我得到這個異常:

異常詳細信息:System.Data.SqlServerCe.SqlCeException:該函數的指定的參數 值無效。 [參數#= 3, 功能(如果已知)的名稱=情況下]

我已經分離出的問題String.Empty。如果我直接使用"",代碼運行良好。如果我使用.Category = String.Empty,它也可以工作。看起來像SqlCe在IfMethodCallExpression內處理MemberAccessExpression的錯誤。

如果我拿出.Category行,一切工作正常。什麼是在LINQ to SQL CE 4中進行空檢查的正確方法?我檢查了Skeet's answer,但我確實想檢查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) 
+0

我認爲這是EF提供程序中用於SQLCE的錯誤,在版本6中已修復https://entityframework.codeplex.com/workitem/287 – ErikEJ

+0

@ErikEJ我在.NET 4.0上,無法升級到4.5。任何方式來獲得修復? (AFAIK EF 4.3+需要.NET 4.5)。 –

+1

實體框架6適用於.NET 4 – ErikEJ

回答

0

這是目前發佈的SQL Server Compact實體框架提供了一個bug,並固定在6 https://entityframework.codeplex.com/workitem/287版本。 Emtity Framework 6支持.NET 4.0,並且您需要的NuGet包是EntityFramework.SqlServerCompact

+0

我搬到了RC,但仍然有錯誤。上面的堆棧跟蹤。 –

+0

我已經隔離了錯誤,在我的問題中的詳細信息。 –

+0

有趣的信息,爲什麼不只是使用「」然後呢? – ErikEJ