在表中,列数据类型是varchar,只检索使用linq到sql的数字/数字列的值

时间:2014-09-11 09:16:04

标签: c# sql linq entity-framework

我有一个包含数据类型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)

6 个答案:

答案 0 :(得分:4)

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

using System.Data.Entity.SqlServer;

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

答案 1 :(得分:0)

您可以使用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)

答案 2 :(得分:0)

请参阅下面的示例,这可能会帮助您。

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

我希望这会对你有所帮助:)。

答案 3 :(得分:0)

实体框架无法将这些查询转换为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();
}

答案 4 :(得分:0)

尝试使用此

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

答案 5 :(得分:0)

不是指定使值不是数字的每个字符,而是指定只需要值的数字就更容易了。

因此在原始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();