我需要编译包含条件“?:”运算符的 LINQ-to-SQL 查询。我能够编译这样的查询,但问题是当我尝试执行它时它失败了。
这是一个简单的重现:
MyContext myContext = new MyContext(sqlConnection);
myContext.Log = Console.Out;
var cq = CompiledQuery.Compile(
(MyContext context, bool option) =>
option ? context.GetTable<User>().Where(x => x.UserId > 5)
: context.GetTable<User>().Where(x => x.UserId < 5));
//Crashes when trying to invoke.
cq.Invoke(myContext, true);
控制台输出显示执行了预期的 sql 语句:
SELECT [t0].[UserId],...
FROM [dbo].[User] AS [t0]
WHERE [t0].[UserId] > @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [5]
但是在尝试从数据库枚举结果集时似乎执行失败。
异常是 InvalidOperationException,消息为“序列包含多个元素。”
堆栈跟踪是:
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
at Read_User(ObjectMaterializer`1 )
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
at Program.Main() ...
任何人都可以提供一种方法来执行它吗?由于我无法深入的原因,我无法将此条件逻辑移到表达式之外 - 它必须是已编译查询的一部分。
最佳答案
这可能是一个错误。错误是它们不会给你一个错误,你不能在多个查询之间运行时切换。他们可能从未打算使用 CompiledQuery.Compile
.
编译两个查询,或者:UserId >= (option ? 0 : 5) && UserId < (option ? 5 : int.MaxValue)
.这个谓词仍然是 SARGable。
关于c# - 如何执行包含条件运算符的 LINQ to SQL 编译查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22024099/