我有一段連接三個表的 C# Linq 代碼;我的代碼類似于以下內容(我更改了物件名稱以免泄露敏感資訊):
Customers
.Join(Products, c => c.CustomerKey, p => p.CustomerKey, (c, p) => new { c, p })
.Join(Transactions, p => p.p.AccountNumber, t => t.AccountNumber, (p, t) => new { p.c, p.p, t })
我正在使用 LinqPad 進行測驗,當我查看生成的 SQL 時,它看起來是正確的;事實上,當我在 SSMS 中執行 SQL 時,輸出看起來完全符合預期 - 一個包含三個表中所有列的平面結果集。
然而,來自 C# 代碼的結果集看起來不同:每條記錄包含三列,每列存盤各自的物件(客戶、產品、交易),如此螢屏截圖所示(敏感資料已被涂黑):

是否有一種簡單的方法來顯示結果,以便將每個物件的屬性組合并水平顯示為列?換句話說,它的顯示方式與執行 SQL 時的方式相同嗎?
當然,我意識到我可以通過new {....}lambda 運算式末尾的陳述句指定匿名物件中的每一列。但似乎應該有一種更簡單的方法來做到這一點。在那兒?還是我實際上需要指定每個屬性?
uj5u.com熱心網友回復:
當然,我意識到我可以通過 lambda 運算式末尾的 new {....} 陳述句指定匿名物件中的每一列。
是的,這正是您需要做的。
但似乎應該有一種更簡單的方法來做到這一點。在那兒?
目前,沒有。
問題是:C# 是一種強型別語言,Enumerable.Join需要明確定義的回傳型別。編譯器可以從作為最終引數提供的 lambda 運算式推斷回傳型別,這至少使您不必顯式定義新類。
現在,C# 語言設計者可以創建一個功能,當 Join 與 LINQ 查詢語法一起使用時自動生成新型別。但是,我認為這不太可能,因為 (a) 凈收益很低,并且 (b) 需要做出許多困難的設計決策(如何處理兩個類中具有相同名稱的屬性等)。 )。
一般來說,C# 開發人員似乎更喜歡明確性(代碼完全按照我撰寫的方式執行)而不是“有用的魔法”。例如,在VB的LINQ查詢語法的實作中,可以省略select子句,編譯器會自動使用當前的迭代變數。在 C# 中,一個類似的提議被拒絕了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/494226.html
上一篇:.NetWebAPI-管理器與存盤庫Find(Expression<Func<TEntity,bool>>運算式)方法的互動
下一篇:為y=>ConstantCollection.Any(x=>y.Contains(x))創建ExpressionTree。不同的范圍引數運算式
