我在sql table列中有一个下面的列表。
IT-001
IT-002
IT-003
IT-004
我想使用LINQ生成下一个代码。目前我正在使用以下代码。我想知道可以使用纯LINQ查询实现它而不使用C#代码。如果是的话怎么样?
private StockDataClassesDataContext dc;
public string getNextItemCode()
{
dc = new StockDataClassesDataContext();
List<string> code = (from tbItem in dc.tblItems
select tbItem.ItemCode).ToList<string>();
List<int> Numbers = new List<int>();
foreach (string item in code)
{
string[] arr = item.Split('-');
Numbers.Add(Convert.ToInt32(arr[1]));
}
int maxNumber = 0;
maxNumber = Numbers.Count > 0 ? Numbers.Max() : 0;
int nextNumber = maxNumber + 1;
string itemCode = "IT-"+nextNumber;
return itemCode;
}
答案 0 :(得分:3)
string nextCode = dc.tblItems.Count()==0 ? "IT-001" : // if it's empty, start with IT-001
"IT-" +
(int.Parse(dc.tblItems.OrderByDescending(i=>i.ItemCode) // order by code descending
.First() // get first one (last code)
.ItemCode.Split('-')[1]) // get only the number part
+1).ToString("000") // add 1 and format with 3 digits
答案 1 :(得分:3)
最佳做法是在数据库中为数字创建单独的字段。像SeqNo列一样。通过这种方式,您可以轻松生成下一个数字,并且易于存储。
答案 2 :(得分:2)
这种项目代码生成方式将失败,如果许多读者连接在一起,他们将最终得到相同的项目代码。
为什么不改变逻辑以避免所有这些问题?
您可以为项目代码文本部分设置自动增量字段和单独的列。如果您有许多这样的子代码并在主表中添加外键,那么也可以存储在单独的表中。
现在您不必担心如何生成下一个代码,因为数据库会自动增加ID号。当您想要显示项目代码时,您可以加入文本部分和ID部分。
希望这对你有所帮助。
答案 3 :(得分:0)
似乎你可以在没有所有列表的情况下做同样的事情。试试这个:
public string getNextItemCode()
{
dc = new StockDataClassesDataContext();
var nextNumber =
(from tbItem in dc.tblItems
select tbItem.ItemCode)
.AsEnumerable()
.Select(code => Convert.ToInt32(code.Substring(code.IndexOf("-") + 1))
.DefaultIfEmpty()
.Max() + 1;
return "IT-" + nextNumber;
}
根据您的Linq提供程序,您可以在查询中完成整数转换,如下所示:
public string getNextItemCode()
{
dc = new StockDataClassesDataContext();
var nextNumber =
(from tbItem in dc.tblItems
let c = tbItem.ItemCode
select Convert.ToInt32(c.Substring(c.IndexOf("-") + 1))
.DefaultIfEmpty()
.Max() + 1;
return "IT-" + nextNumber;
}
我基于代码的最终返回值,但正如其他人指出的那样,这会产生格式不正确的字符串(IT-1
而不是IT-001
)。你应该使用格式字符串来让你的生活更轻松:
return "IT-" + nextNumber.ToString("D3");
// or
return string.Format("IT-{0:D3}", nextNumber);