我的数据库中有一个包含这些值的字符串类型的列:
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中这样做吗?
答案 0 :(得分:3)
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()))
它只会从字符串中获取整数以进行比较,尽管它不是很漂亮。
答案 1 :(得分:1)
为此,您需要使用自定义comparer。像这样:
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();