我的代碼:
var ids = new int[] { 16259,16238,16240,16243 };
var teamQuery = _teamRepository.Where(team => ids.Contains(team.ID));
var teams = teamQuery.ToList();
我有一個teamQuery 形成查詢的 IQueryable 物件
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
FROM [dbo].[Team] AS [Extent1]
WHERE [Extent1].[ID] IN (16259, 16238, 16240, 16243)
我可以teams在 ToList() 實作期間在生成的 List 物件中保持與 IN 方法(16259、16238、16240、16243)中相同的順序嗎?
現在物件的順序teams是 [16238, 16240, 16243, 16259]
uj5u.com熱心網友回復:
這是您想要嘗試和近似的 SQL:
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
FROM [dbo].[Team] AS [Extent1]
WHERE [Extent1].[ID] IN (16259, 16238, 16240, 16243)
ORDER BY CASE [Extent1].ID
WHEN 16259 THEN 0
WHEN 16238 THEN 1
WHEN 16240 THEN 2
WHEN 16243 THEN 3
ELSE 4
END;
我不建議將此作為通用解決方案,除非您的選項串列被限制為非常小:
var ids = new [] { 16259, 16238, 16240, 16243 };
var firstId = ids.First();
var teamQuery = _teamRepository.Where(team => ids.Contains(team.ID))
.OrderByDescending(t => t.Id == firstId);
foreach(var id in ids.Skip(1))
{
teamQuery = query.ThenByDescending(t => t.Id == id);
}
var teams = teamQuery.ToList();
更有效的解決方案是在資料庫中執行后通過與原始陣列索引相關來對結果進行排序:
var ids = new [] { 16259, 16238, 16240, 16243 };
var teamData = _teamRepository.Where(team => ids.Contains(team.ID)).ToList();
var teams = teamData.OrderBy(team => ids.IndexOf(team.ID)).Tolist();
要在純 SQL 中有效地為大型串列執行此操作,首先需要創建有序串列作為表參考,然后您可以按該串列中的位置進行排序,但 LINQ to SQL 不會輕易復制相同的程序,除非您定義一個架構中的特定用戶定義型別。
您還可以插入這種型別的查詢,或將其構造為原始 SQL,這為您提供了更多選項但更少 LINQish。
通常,我們可以使用 C# 中更高效的代碼以這些自定義方式對資料進行排序。除非串列非常大,否則對資料庫進行排序幾乎沒有什么好處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437624.html
