下一个数字在LINQ中生成

时间:2013-05-01 04:45:12

标签: c# asp.net linq

我在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;
        }

4 个答案:

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