linq 是链接中数字检查

ccgok5k5  于 2022-12-06  发布在  其他
关注(0)|答案(7)|浏览(106)

以下链接

var subjectMarks = (from DataRow row in objDatatable.Rows
                    select Convert.ToDecimal(row["EXM_MARKS"])).Sum();

抛出一个异常,因为某些row["EXM_MARKS"]包含非数字值,如AB等。如何从这些值中获取仅为数字值的总和?

70gysomp

70gysomp1#

添加where子句以筛选出无法解析为小数的记录。尝试:

decimal dummy;

var subjectMarks = (from DataRow row in objDatatable.Rows
                     where decimal.TryParse(row["EXM_MARKS"], out dummy)
                     select Convert.ToDecimal(row["EXM_MARKS"])).Sum();
8iwquhpp

8iwquhpp2#

您可以创建一个扩展方法SafeConvertToDecimal并在LINQ查询中使用它:

var subjectMarks = (from DataRow row in objDatatable.Rows
                    select row["EXM_MARKS"].SafeConvertToDecimal()).Sum();

此扩展方法如下所示:

public static decimal SafeConvertToDecimal(this object obj)
{
    decimal result;
    if(!decimal.TryParse(obj.ToString(), out result))
        result = 0;

    return result;
}

这种方法的优点是它看起来很干净,而且您不会像所有其他答案那样将每个对象转换两次。

lvmkulzt

lvmkulzt3#

对于linq to sql查询,可以使用内置的SqlFunctions.IsNumeric
来源:SqlFunctions.IsNumeric

f1tvaqid

f1tvaqid4#

使用了

Decimal Z;

var subjectMarks = (from DataRow row in objDatatable.Rows
                     where Decimal.TryParse (row["EXM_MARKS"], out Z)
                     select Convert.ToDecimal(row["EXM_MARKS"])).Sum();
js4nwp54

js4nwp545#

你可以像这样做一些扩展实用程序类来获得优雅的解决方案:

public static class TypeExtensions
{
    public static bool IsValidDecimal(this string s)
    {
        decimal result;
        return Decimal.TryParse(s, out result);
    }
}

并以这种方式使用它:

var subjectMarks = (from DataRow row in objDatatable.Rows
                     where row["EXM_MARKS"].IsValidDecimal()
                     select Convert.ToDecimal(row["EXM_MARKS"])).Sum();

希望这对你有帮助。

n3ipq98p

n3ipq98p6#

var subjectMarks = objDatatable.Rows.Where(row => row["EXM_MARKS"].ToString().All(char.isDigit))

部分溶液取于:here

lf5gs5x2

lf5gs5x27#

对于使用实体框架核心的LINQ to SQL查询,ISNUMERIC函数是EF下EF Core 6.0的一部分。函数
6.0之前版本可以创建自定义函数Map!
User-defined function mapping:除了EF Core提供程序提供的Map外,用户还可以定义自定义Map。用户定义的Map可以根据用户需要扩展查询转换。当数据库中存在用户定义的函数时(例如,用户希望从其LINQ查询调用这些函数),此功能非常有用。

await using var ctx = new BlogContext();
await ctx.Database.EnsureDeletedAsync();
await ctx.Database.EnsureCreatedAsync();

_ = await ctx.Blogs.Where(b => ctx.IsNumeric(b.Name)).ToListAsync();

public class BlogContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    static ILoggerFactory ContextLoggerFactory
        => LoggerFactory.Create(b => b.AddConsole().AddFilter("", LogLevel.Information));

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseSqlServer(@"Server=localhost;Database=test;User=SA;Password=Abcd5678;Connect Timeout=60;ConnectRetryCount=0")
            .EnableSensitiveDataLogging()
            .UseLoggerFactory(ContextLoggerFactory);

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDbFunction(IsNumericMethodInfo)
            .HasName("ISNUMERIC")
            .IsBuiltIn();
    }

    private static readonly MethodInfo IsNumericMethodInfo = typeof(BlogContext)
        .GetRuntimeMethod(nameof(IsNumeric), new[] { typeof(string) });

    public bool IsNumeric(string s) => throw new NotSupportedException();
}

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
}

相关问题