在实体框架linq查询中将字符串转换为int并处理解析异常

S3d*_*di9 9 c# linq entity-framework

我有这个问题,我有一张桌子可供购买

Purchases(Date DateTime, Number string)
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的记录,所以我需要Max(Number),这里的问题是Number是一个字符串,我试过了

Purchases.Select(X=>int.Parse(X.Number)).Max()
Run Code Online (Sandbox Code Playgroud)

但它可能会抛出异常,我创建了一个自定义ToInt()扩展,所以当我使用时

Purchases.Select(X=>X.Number.ToInt()).Max()
Run Code Online (Sandbox Code Playgroud)

它抛出一个异常,说我的ToInt()不能与着名的ToString()相同的linq查询一起使用

所以我的问题是:有没有办法在linq查询中同时将字符串转换为int并同时处理异常或将自定义函数集成到linq查询中!!

这是我的扩展

    public static int ToInt(this string s)
    {
        try
        {
            return int.Parse(s);
        }
        catch
        {
        }
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

Gro*_*mer 12

第一种方式:

var numbers = Purchases.Select(x => x.Number).ToList();

int temp;
int max = numbers.Select(n => int.TryParse(n, out temp) ? temp : 0).Max();

Console.WriteLine("Max: {0}", max);
Run Code Online (Sandbox Code Playgroud)

第二种方式:

int temp2;
int max2 = Purchases.Select(x => x.Number).ToList().Select(n => int.TryParse(n, out temp2) ? temp2 : 0).Max();

Console.WriteLine("Max 2: {0}", max2);
Run Code Online (Sandbox Code Playgroud)

关键在于.ToList()这两种方式.它string从数据库中获取所有数据,因此当您调用int.TryParse结果时,数据库查询已经运行,因此它使用纯CLR代码,而不是尝试转换int.TryParse为SQL查询.我在我的一个Sandbox项目中创建了一个EF上下文并验证了它的工作原理.

  • 应该注意的是,通过枚举数据集,您将查询的所有数据从数据库中提取到内存中。如果您正在执行需要转换为 int 的轻量级查询,这将是低效的,并且会在内存中进行进一步的操作,而不是在数据库上。 (2认同)