簡體   English   中英

使用 LINQ orderby 時出現異常:“無法比較數組中的兩個元素”

[英]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.CCodegroup 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.

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