【问题标题】:In a table a column datatype is varchar, retrieve only those values of the column which are number / numeric using linq to sql在表中,列数据类型为 varchar,使用 linq to sql 仅检索列的数字/数字值
【发布时间】:2014-09-11 09:16:04
【问题描述】:

我有一个数据类型为varchar 的表。我只需要从列中检索那些纯数字的值。为此,我使用了如下所示的 Linq 查询,它只检查小写字母。它无法检查此@-1234。我正在提供我想要做什么的详细信息。

   | input |     | expected output |
   | @!qw1 |     |      12345      |
   | 12345 |     |      90345      |
   | ab567 |     
   | 90345 |             
   | 123-q |   

代码:

 pricingdemoEntities price = new pricingdemoEntities();

 var money = (from demos in price.demotables
              where false == (demos.value.Contains("a") || demos.value.Contains("b") || demos.value.Contains("c") || demos.value.Contains("d") || demos.value.Contains("e") || demos.value.Contains("f") || demos.value.Contains("g") || demos.value.Contains("h") ||
                              demos.value.Contains("i") || demos.value.Contains("j") || demos.value.Contains("k") || demos.value.Contains("l") ||
                              demos.value.Contains("m") || demos.value.Contains("n") || demos.value.Contains("o") || demos.value.Contains("p") || 
                              demos.value.Contains("q") || demos.value.Contains("r") || demos.value.Contains("s") || demos.value.Contains("t") || 
                              demos.value.Contains("u") || demos.value.Contains("v") || demos.value.Contains("w") || demos.value.Contains("x") ||
                              demos.value.Contains("y") || demos.value.Contains("z")) 
              select demos.value).ToList();

foreach (var final in money)

【问题讨论】:

    标签: c# sql linq entity-framework


    【解决方案1】:

    您可以使用SqlFunctions.IsNumeric扩展方法。

    using System.Data.Entity.SqlServer;
    
    var money = (from demos in price.demotables
        where SqlFunctions.IsNumeric(demos.value) == 1
        select demos.value).ToList();
    

    【讨论】:

    • 哇!不知道SqlFunctions!谢谢
    • @reckface,其他有趣的扩展可以找到herehere
    【解决方案2】:

    您可以使用long.TryParse 来检查数值

    pricingdemoEntities price = new pricingdemoEntities();
    long num;
    var money= (from demos in price.demotables
    
            where long.TryParse(demos.value.ToString(),out num) 
            select demos.value).ToList();
    foreach (var final in money)
    

    【讨论】:

    • long.TryParse(demos.value.ToString(),out num) 在 linq 中不起作用。
    【解决方案3】:

    请看下面的例子,也许这会对你有所帮助。

    string[] stringList = { "123", "xsd", "%Vhh", "123H", "5841" }; // just an array of strings
    
    var a = stringList.Where(x => x.All(char.IsDigit)); // checking for digits and returning them
    

    希望对你有帮助:)

    【讨论】:

    • 你能把你正在尝试的代码传给我吗..因为我试过的上面的代码工作正常。
    • @HiteshMistry 您的代码不是实体的 linq。尝试使用类似于 OP 代码的内容。
    • 这只是一个示例,您只需使用 linq 将数据获取到列表或数组中的实体,然后使用我的代码的第二行。
    【解决方案4】:

    Entity Framework 无法将这些查询转换为 SQL,因此一种选择是首先实现您的结果。这不是很有效,但您可以通过限制在查询中返回的内容来改进它。然后对结果进行数值检查。

    例如:

    var acceptable = ".,0,1,2,3,4,5,6,7,8,9"; // list of acceptable values
    var nums = acceptable.Split(',').Select(a=> a[0]); // get the chars
    using(var price = new pricingdemoEntities())
    {
      // You can limit this even further by adding a take or additional where clauses
      var query = price.demotables.Select(p => p.value).AsEnumerable();
      var money = query.Where(q=> q.value.All(c=> nums.Contains(c)).ToList();
    }
    

    【讨论】:

      【解决方案5】:

      试试这个

      price.demotables.Where(x=>SqlFunctions.IsNumeric(x.Data)==1).ToList()
      

      【讨论】:

        【解决方案6】:

        与其指定使值不是数字的每个字符,不如只指定您只需要数字时的值会容易得多。

        所以在原始 SQL 中可能看起来像这样:

        SELECT val
        FROM table
        WHERE ISNUMERIC(val) = 1
        

        Entity Framework 中,您可以使用方便的SqlFunctions.IsNumeric 方法创建类似的查询。

        在你的情况下,它看起来像这样:

        var money = (
            from demos in price.demotables
            where SqlFunctions.IsNumeric(demos.value) == 1
            select demos.value).ToList();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多