T-SQL IsNumeric() and Linq-to-SQL

前端 未结 4 1925
再見小時候
再見小時候 2021-01-12 09:49

I need to find the highest value from the database that satisfies a certain formatting convention. Specifically, I would like to find the highest value that looks like

4条回答
  •  情深已故
    2021-01-12 10:52

    You could make use of the ISNUMERIC function by adding a method to a partial class for the DataContext. It would be similar to using a UDF.

    In your DataContext's partial class add this:

    partial class MyDataContext
    {
        [Function(Name = "ISNUMERIC", IsComposable = true)]
        public int IsNumeric(string input)
        {
            throw new NotImplementedException(); // this won't get called
        }
    }
    

    Then your code would use it in this manner:

    var query = dc.TableName
                  .Select(p => new { p.Col, ReplacedText = p.Col.Replace("EU", "") })
                  .Where(p => SqlMethods.Like(p.Col, "EU%")
                            && dc.IsNumeric(p.ReplacedText) == 1)
                  .OrderByDescending(p => p.ReplacedText)
                  .First()
                  .Col;
    
    Console.WriteLine(query);
    

    Or you could make use MAX:

    var query = dc.TableName
                  .Select(p => new { p.Col, ReplacedText = p.Col.Replace("EU", "") })
                  .Where(p => SqlMethods.Like(p.Col, "EU%")
                      && dc.IsNumeric(p.ReplacedText) == 1);
    
    var result = query.Where(p => p.ReplacedText == query.Max(p => p.ReplacedText))
                      .First()
                      .Col;
    
    Console.WriteLine("Max: {0}, Result: {1}", max, result);
    

    Depending on your final goal it might be possible to stop at the max variable and prepend it with the "EU" text to avoid the 2nd query that gets the column name.

    EDIT: as mentioned in the comments, the shortcoming of this approach is that ordering is done on text rather than numeric values and there's currently no translation for Int32.Parse on SQL.

提交回复
热议问题