[英]Exception when using LINQ orderby: "Failed to compare two elements in the array"
以下是重現異常的示例代碼:
using Microsoft.EntityFrameworkCore.Metadata.Conventions;
using Microsoft.EntityFrameworkCore;
namespace Demo
{
[Keyless]
public class Contact
{
public string Name { get; set; } = default!;
public string? Address { get; set; } = default!;
public int? CCode { get; set; } = 0;
public int OtherValue { get; set; } = 0;
}
public class Foo
{
public static void Main()
{
List<Contact> raw = new();
raw.Add(new Contact { CCode = 1, Name = "Foo", Address = "Bar" });
raw.Add(new Contact { CCode = 2, Name = "Foo", Address = "Bar" });
ProcessRawResults(raw);
}
public static void ProcessRawResults(List<Contact> raw)
{
var q = from i in raw
group i by new { i.CCode, i.Name, i.Address } into g
orderby g.Key
select g;
foreach (var group in q)
{
}
}
}
}
執行此程序時,執行到foreach (var group in q)
時拋出異常:
System.InvalidOperationException:“無法比較數組中的兩個元素。”
內部異常
ArgumentException:至少一個 object 必須實現 IComparable
我已經查看了有關嘗試對列表進行排序時出現的此錯誤消息的其他 SO 問題; 但在這段代碼中我不確定哪個操作需要比較器。 似乎orderby g.Key
操作可能需要比較組中的匿名 class,但是匿名 class 不應該有默認比較器嗎? 或者,如果沒有,我不確定將代碼放在哪里來實現它。
令人困惑的是,如果我用新行將i.CCode
從group i by new
中取出,那么異常就不會再發生了。
背景:我的真實項目是一個使用 EFCore 6 的 Blazor 應用程序,並且正在從存儲過程結果中接收到一個List<Contact>
,因此它必須是[Keyless]
。 我必須使用未修改的現有存儲過程,因此我在我的代碼中執行結果轉換。 我希望折疊結果集,以便所有具有相同(CCode、名稱、地址)的條目都在一行中,並且我將在該行中將 OtherValue 連接到一個列表中。
我想這是因為int?
實際上是Nullable<int>
並且Nullable<T>
沒有實現IComparable
。 我剛剛測試了您的代碼,但將分組更改為:
group i by new { CCode = i.CCode.HasValue ? i.CCode.Value : (int?)null, i.Name, i.Address } into g
它似乎起作用了。 至少它沒有拋出那個異常。
匿名類型沒有比較器,通過屬性指定順序:
var q = from i in raw
group i by new { i.CCode, i.Name, i.Address } into g
orderby g.Key.CCode, g.Key.Name, g.Key.Address
select g;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.