下面是一个非常简单的Entity类和数据示例。
Public Class MyTable
Public int Id { get; set; }
Public string Classification { get; set; }
Public string Description { get; set; }
}
// Sample data :
context.MyTable.Add(new MyTable('10.000', '...'));
context.MyTable.Add(new MyTable('10.001', '...'));
context.MyTable.Add(new MyTable('10.002', '...'));
context.MyTable.Add(new MyTable('11.000', '...'));
context.MyTable.Add(new MyTable('11.001', '...'));
context.MyTable.Add(new MyTable('11.002', '...'));
context.MyTable.Add(new MyTable('11.003', '...'));
context.MyTable.Add(new MyTable('11.004', '...'));
context.MyTable.Add(new MyTable('12.000', '...'));
我不希望为给定的输入值返回下一个可用的 Classification 值。
例如:
对于上面的第一个示例,输入值为'10 .000',因此通过一步一步地检查值是否存在。只要数据库中已存在该值,我们就会继续搜索n + 1。
进行LINQ的最佳方法是什么?
答案 0 :(得分:0)
如果整数中没有缺失值(例如10.000
),则可以使用以下方法获得最高的值:
string input = "10.000";
string nextFree = input;
string max = mySet
.Where(x => x.Classification.StartsWith(input.Substring(0, 3)) // I.e. "10."
.Select(x => x.Classification)
.DefaultIfEmpty()
.Max();
if (max != null) {
decimal maxNum = Decimal.Parse(max);
nextFree = (maxNum + 0.001m).ToString("0.000");
}
但是如果它们之间缺少值:
string input = "10.000"; // Must always be a value with .000
var classifications = mySet
.Where(x => x.Classification.StartsWith(input.Substring(0, 3))
.OrderBy(x => x.Classification)
.Select(x => x.Classification)
.ToList();
decimal nextNum = Decimal.Parse(input);
foreach (string classification in classifications)
{
decimal n = Decimal.Parse(classification);
if (n > nextNum) {
break; // Found the next free value.
}
nextNum += 0.001m;
}
string nextFree = nextNum.ToString("0.000");