還有其他類似于我的問題,但他們沒有幫助我。我正在執行一個簡單的 Linq group by 操作,在 SQL Server Management Studio 和 Linqpad 中,我從一個包含 36,102 條記錄的表中獲得了 23,859 個結果。這是我認為正確的結果。
出于某種原因,當我將查詢移動到我的 Visual Studio 應用程式代碼中時,我得到了 22,463 個組——我終生無法弄清楚原因。
我需要根據 8 列的唯一組合對該表的行進行分組。這些列包含帳戶 ID、人員 ID、設備 ID、場所 ID 和地址列。基本上,一個人可以有多個帳戶、多個場所、多個設備,并且每個場所都可以有自己的地址。我知道缺少表格設計......它是客戶提供的,并且還有其他列需要格式 - 但它不應該與分組相關。
SQL Server:23859 個組:
SELECT acct_id, per_id, dev_id, prem_id, address, city, state, postal
FROM z_AccountInfo GROUP BY acct_id, per_id, dev_id, prem_id, address, city, state, postal
ORDER BY per_id
Linqpad:23859 組:
//Get all rows...
List<z_AccountInfo> zAccounts = z_AccountInfo.ToList();
//Group them...
var zAccountGroups = (from za in zAccounts
group za by new { za.acct_id, za.per_id, za.dev_id, za.prem_id, za.address, za.city, za.state, za.postal } into zaGroups
select zaGroups).OrderBy(zag => zag.Key.per_id).ToList();
Visual Studio:22463 個組 - 錯誤?:
//Intantiate list I can use outside of Entity Framework context...
List<z_AccountInfo> zAccounts = new List<z_AccountInfo>();
using (Entities db = Entities.CreateEntitiesForSpecificDatabaseName(implementation))
{
//Get all rows. Count verified to be correct...
zAccounts = db.z_AccountInfo.OrderBy(z => z.per_id).ToList();
}
// Group the rows. Doesn't work??? 22463 groups?
var zAccountGroups = (from z_AccountInfo za in zAccounts
group za by new { za.acct_id, za.per_id, za.dev_id, za.prem_id, za.address, za.city, za.state, za.postal } into zag
select zag).ToList();
我希望有人能發現語法問題或我遺漏的其他東西。似乎 Visual Studio 正在對某些東西進行分組......但它被 1396 個組關閉......這非常重要。
更新:sgmoore 下面的評論讓我走上了確保 Linqpad 和 Visual Studio 中的 zAccounts 串列匹配的軌道。他們不!?!在 SQL Server 中查詢表顯示此資料(帳戶/設備/前提)
在 Beyond Compare 中檢查 Visual Studio 輸出顯示設備 ID 6106471 被錯誤地重復/復制了 4 個底行......這意味著這里應該有 2 個組,但我的查詢只會看到 1 個......
由于我使用 Entity Framework 在 Visual Studio 中查詢表中的資料,這讓我覺得我的模型有問題,但我不知道它可能是什么。Beyond compare 顯示了同樣的問題多次發生,并解釋了組數關閉的原因。就像 EF 知道有 8 行(在這種情況下) - 但區分它們的欄位沒有出現。
我嘗試截斷表格并將所有資料重新添加到其中并重新運行,但不良行為仍然存在。這里很困惑 - 我以前從未遇到過物體框架的這種問題。
我什至在 VS 執行時運行了 SQL Profiler,并捕獲了物體框架正在觸發的查詢以填充 zAccounts。該查詢在 SQL Server 中自行觸發時正確顯示四個 7066550 行。這似乎完全適用于物體框架和填充完整集合的 ToList() 呼叫 - 任何人的想法?
uj5u.com熱心網友回復:
簡短的回答 - 確保物體框架模型中的表在列的值是唯一的列上具有物體鍵。
更長的答案 - 為了排除故障,我運行了 SQL Profiler 以確保 EF 發送到 SQL Server 的查詢是正確的 - 確實如此。我運行該查詢并檢查結果以查看我想要的資料。問題是我的模型。我在不包含唯一值的欄位上設定了物體鍵。我的猜測是 EF 假設由于該欄位設定為物體鍵,因此值必須是唯一的。基于此,它以某種方式索引或快取“id”所在的第一行,然后將該行的值投影到查詢結果中。如果沒有對標記為物體鍵的欄位進行驗證檢查,我認為這是一個糟糕的假設。我意識到我應該責怪我告訴它使用非唯一欄位作為物體鍵 - 但我不認為如果沒有它至少發出警告,這將是一個好主意。
無論如何,為了解決這個問題,我在表中添加了一個適當的 id 列,并將其設定為 Identiy 規范和自動增量,以便表中的任何行都有一個唯一的 id。之后,我更新了我的 edmx 以使用我的新列作為物體鍵并重新運行我的代碼,然后一切都神奇地開始作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510652.html