使用EF

时间:2016-10-03 15:49:46

标签: c# entity-framework sorting type-conversion

我的数据库中有一个包含这些值的字符串类型的列:

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中这样做吗?

2 个答案:

答案 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();