簡體   English   中英

如何執行包含條件運算符的LINQ to SQL編譯查詢?

[英]How to execute a LINQ to SQL Compiled Query that contains a conditional operator?

我需要編譯一個包含條件“?:”運算符的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) 該謂詞仍然可以保存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM