gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:54:37 24 4
gpt4 key购买 nike

所以我正在构建一个包含重复事件的事件日历。为了捕捉重复发生的事件,我采用了位移位的方法来存储重复发生的信息。我如何或为何采用这种方法并不太重要,但在我的 lambda 中运行位移位代码时,我遇到了不受支持的异常。

这里是否有明显的原因导致我收到不受支持的异常?

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();

编辑 - 添加我的除法位移位代码,因为该代码绝对适用于 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();

以下是异常详细信息:

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

最佳答案

您正在对 Entity Framework 查询运行右移 (>>>) 运算符。由于查询不在 CLI 中执行,而是转换为 SQL 并在数据库上运行,因此您不能在查询中随意使用 任何 运算符。 EF 无法将右移运算符转换为 SQL。这同样适用于等效的二次幂除法。

您可以从数据库中获取数据并在内存中执行移位,但您在 Where 子句中使用移位,该子句始终在数据库上执行。所以恐怕您的位移位方法不适用于 EF。

更新:

正如 @Juan 指出的那样,您可以将整个查询传输到存储过程并从 EF 调用它。您可能想查看 this Q&A有关如何在 SQL 中执行移位的详细信息。

关于c# - 在 C# 中的数据模型上运行 lambda 时不支持的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41109892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com