使用LINQ在sql server 2012中查找nvarchar列的最大值

时间:2014-03-06 05:25:07

标签: sql vb.net linq sql-server-2012 isnumeric

我有一个充满产品序列号的表,数据类型是nvachar,我有1001,1002,1003,abc001,efg002,1004,def222等条目。我必须返回列中有效数字的max value,在这种情况下输出应为1004.

此SQL查询正在运行

select top 1
  cast(SerialNo as integer)
from [InvSerialItemDetails]
where isNumeric(SerialNo) = 1
Order by cast(SerialNo as integer) desc

我必须在LINQ中做同样的事情。但LINQ中没有isNumeric函数。如何在VB语言的LINQ中获得相同的输出

3 个答案:

答案 0 :(得分:0)

如果您使用的是Linq to Entities,那么 是Linq中隐藏的IsNumeric函数。

答案 1 :(得分:0)

她是VB.Net的一个例子。我只使用了一个字符串列表,LINQ表达式将获取List中的最高数字。

    Dim nvarcharNubers As List(Of String) = New List(Of String)

    nvarcharNubers.Add("abc1007")
    nvarcharNubers.Add("1002")
    nvarcharNubers.Add("1003")
    nvarcharNubers.Add("1004")
    nvarcharNubers.Add("2000fg")
    nvarcharNubers.Add("999")

    Dim TopNumberOnly = From i In nvarcharNubers
                      Where IsNumeric(i)
                      Select i = Integer.Parse(i)
                      Order By i Descending
                      Take 1

或者如果您想使用Lambda语句:

    Dim TopNumberOnly = nvarcharNubers _
                        .Where(Function(w) IsNumeric(w)) _
                        .Select(Function(s) Integer.Parse(s)) _
                        .OrderByDescending(Function(o) o) _
                        .Take(1)

答案 2 :(得分:-1)

如果您确定您的数据库字段仅包含数字值,则始终可以使用 max 表示nvarchar字段。见下面的例子:

var serials = new List<SerialObject>();

// Add AlphaNumeric value to the list
serials.Add(new SerialObject()
                {
                    Id = "1",
                    Serial = "aa10a1"
                });

// Add AlphaNumeric value to the list
serials.Add(new SerialObject()
{
    Id = "2",
    Serial = "cc11da"
});

// Add Numeric values to the list
for (int i = 0; i < 5; i++)
{
    serials.Add(new SerialObject()
                    {
                        Id = i.ToString(),
                        Serial = (1000 + i).ToString()
                    });
}

// Fetch max numeric from list using regular expression
var regex = new Regex("^[0-9]*$");

var numbers = serials.Where(a => regex.IsMatch(a.Serial)).Select(a => a.Serial).ToList();

var max = numbers.Max(a => a);

串行对象类

public class SerialObject
    {
        public string Id { get; set; }

        public string Serial { get; set; }
    }
}