c# - 如何执行包含条件运算符的 LINQ to SQL 编译查询?

标签 c# .net linq-to-sql linq.compiledquery

我需要编译包含条件“?:”运算符的 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/

相关文章:

c# - ASP.NET MVC 4 如何使用自定义 membershipprovider 和 roleprovider 实现 Oauth

c# - "Cannot create an instance of the abstract class or interface"C#错误信息

linq-to-sql - Linq to SQL 和 Rob Conery 存储库模式的并发性

linq-to-sql - 如何优化统计计数顺序以及为何如此缓慢

c# - Linq 相当于分组选择

c# - ReSharper 提示成员 "ID"中的大写字母 "EntityID"

c# - 如何在 Entity Framework 中处理空值?

c# - 数字必杀技 : Where does a callvirt of a non-existent method end up?

c# - 为什么 GetEntryAssembly 返回 null?

c# - 使用 subselect 优化 linq to sql 查询以获得最新结果