使用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中做到吗?
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();