使用EF对数字和字母串进行排序

本文关键字:排序 EF 数字 使用 | 更新日期: 2023-09-27 18:11:23

我的数据库中有一个`string类型的列,其中包含以下值:

410
AFP-EXEC
412
411
AFP-EXEP

所以我想对它们进行排序,正如你所看到的:

_materialIssueVoucherRepository.Get().OrderBy(i=>int.Parse(i.Code)).ToList()

但它返回一个明显的错误Convert error string to int,结果应该是这样的:

410
411 
412
AFP-EXEC
AFP-EXEP

字母表部分并不重要,我能在EF中做到吗?

使用EF对数字和字母串进行排序

int temp;
_materialIssueVoucherRepository
        .Get()
        .OrderBy(i => int.TryParse(i.Code, out temp) ? temp : int.MaxValue)
        .ToList()

听起来你想忽略字符串中的非数字字符,然后使用整数作为排序的一部分。你可以试试:

.OrderBy(i => int.Parse(new string(i.Where(char.IsDigit).ToArray()))

它将只从字符串中获取整数进行比较,尽管它不是很漂亮。

为此需要使用自定义比较器。像这样:

public class AlphanumComparator : IComparer<string>
{
    public int Compare(string str1, string str2)
    {
        if (IsNumeric(str1) && IsNumeric(str2))
        {
            if (Convert.ToInt32(str1) > Convert.ToInt32(str2)) return 1;
            if (Convert.ToInt32(str1) < Convert.ToInt32(str2)) return -1;
            if (Convert.ToInt32(str1) == Convert.ToInt32(str2)) return 0;
        }
        if (IsNumeric(str1) && !IsNumeric(str2))
            return -1;
        if (!IsNumeric(str1) && IsNumeric(str2))
            return 1;
        return String.Compare(str1, str2, StringComparison.OrdinalIgnoreCase);
    }
    public static bool IsNumeric(object value)
    {
        try
        {
            int num = Convert.ToInt32(value.ToString());
            return true;
        }
        catch (FormatException)
        {
            return false;
        }
    }
}

然后:

_materialIssueVoucherRepository.Get().OrderBy(x => x.Code, new AlphanumComparator()).ToList();