Нахождение максимального значения столбца nvarchar в SQL Server 2012 с помощью LINQ
У меня есть таблица, полная серийных номеров продукта, тип данных 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. Как получить такой же вывод в LINQ
на языке VB
3 ответа
Если вы используете Linq to Entities
есть довольно скрытый IsNumeric
функция в Linq.
Ее пример в VB.Net. Я просто использовал список строк, и выражение LINQ захватит самое большое число в списке.
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
или если вы хотите использовать лямбда-операторы, тогда:
Dim TopNumberOnly = nvarcharNubers _
.Where(Function(w) IsNumeric(w)) _
.Select(Function(s) Integer.Parse(s)) _
.OrderByDescending(Function(o) o) _
.Take(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);
Класс Serial Object
public class SerialObject
{
public string Id { get; set; }
public string Serial { get; set; }
}
}