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上下文并验证了它的工作原理.