1

我在 sql 表列中有以下类型的列表。

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

4 回答 4

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
于 2013-05-01T05:10:18.040 回答
3

最佳做法是在数据库中为数字创建一个单独的字段。像 SeqNo 列。这样,您可以轻松生成下一个数字,并且易于存储。

于 2013-05-01T07:19:54.617 回答
2

如果许多阅读器连接到一个,这种项目代码生成方式将失败,他们最终会得到相同的项目代码。

你为什么不改变逻辑来避免所有这些问题呢?

您可以为项目代码文本部分设置自动增量字段和单独的列。如果您有许多这样的子代码并在主表中添加外键,那也可以存储在单独的表中。

现在您不必担心如何生成下一个代码,因为数据库会自动增加 id 编号。当您想显示项目代码时,您可以加入文本部分和 id 部分。

于 2013-05-01T06:03:24.637 回答
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);
于 2013-05-01T05:07:04.117 回答