在C#中的数据模型上运行lambda时不支持异常

Scu*_*eve 3 c# asp.net lambda entity-framework asp.net-mvc-5

所以我正在构建一个包含重复活动的活动日历.为了捕捉反复出现的事件,我采用了一种转移方法来存储重复出现的信息.我采用这种方法的方式或原因并不太重要,但是当我在lambdas中运行位移代码时,我得到了一个不支持的异常.

这里有一个明显的原因,为什么我得到一个不支持的异常?

ab = db.Availabilities.Where(s => (((s.day_cycle_bitmask >> (fromDate.AddDays(i).Subtract(s.start_date).Days % s.num_days_in_cycle)) & 1) == 1
                                                        || ((s.eve_cycle_bitmask >> (fromDate.AddDays(i).Subtract(s.start_date).Days % s.num_days_in_cycle)) & 1) == 1
                                                        || ((s.night_cycle_bitmask >> (fromDate.AddDays(i).Subtract(s.start_date).Days % s.num_days_in_cycle)) & 1) == 1
                                                        ) && s.employee_id_fk == employee.employee_id_pk
                                                        ).ToList();
Run Code Online (Sandbox Code Playgroud)

编辑 - 通过除法代码添加我的位移,因为该代码肯定适用于TSQL

// ab = d

b.Availabilities.Where(s => (s.night_cycle_bitmask /
                    //                                         (int)Math.Pow(fromDate.AddDays(i).Subtract(s.start_date).TotalDays % s.num_days_in_cycle, 2) & 1) == 1
                    //                                         || (s.day_cycle_bitmask / (int)Math.Pow(fromDate.AddDays(i).Subtract(s.start_date).Days % s.num_days_in_cycle, 2) & 1) == 1
                    //                                         || (s.eve_cycle_bitmask / (int)Math.Pow(fromDate.AddDays(i).Subtract(s.start_date).Days % s.num_days_in_cycle, 2) & 1) == 1
                    //                                         && s.employee_id_fk == employee.employee_id_pk).ToList();
Run Code Online (Sandbox Code Playgroud)

以下是异常详细信息:

Exception thrown: 'System.NotSupportedException' in EntityFramework.dll
Exception thrown: 'System.NotSupportedException' in EntityFramework.dll
Exception thrown: 'System.NotSupportedException' in EntityFramework.SqlServer.dll
'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/3/ROOT-1-131260520212908911): Loaded 'C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\14.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll'. 
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.NotSupportedTranslator.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.BitwiseBinaryTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.BinaryTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.BinaryTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.BinaryTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert()
   at System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
   at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__6()
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()
   at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at RCHHRATool.Controllers.AvailabilitiesController.GetEvents(String start, String end) in C:\Users\Sean\Documents\Visual Studio 2015\Projects\RCHHRATool\RCHHRATool\Controllers\AvailabilitiesController.cs:line 170
Run Code Online (Sandbox Code Playgroud)

Sef*_*efe 7

您正在>>实体框架查询上运行right-shift()运算符.由于查询不是在CLI中执行,而是转换为SQL并在数据库上运行,因此您无法在查询中使用任何运算符.并且右移运算符不能通过EF转换为SQL.这同样适用于等效的二次幂除法.

您可以从DB获取数据并执行内存中的移位,但您正在使用Where子句中的移位,该移位始终在DB上执行.所以我担心你的位移方法不适用于EF.

更新:

正如@Juan所指出的,您可以将整个查询转移到存储过程并从EF调用它.您可能需要查看此问答,了解有关如何在SQL中执行位移的详细信息.

  • 只是为了补充这个答案,另一种方法是使用存储过程并将其映射到导入的函数.然后,您可以在SQL服务器端执行位移,并获得所需的结果.看看这个:http://stackoverflow.com/questions/1110155/bitshift-operations-in-t-sql (2认同)