首页 > 解决方案 > 如何动态检查 if 语句

问题描述

我的问题如下,我需要通过数据库检查条件。这意味着在简单的应用程序中,我们检查是否有这样的条件。

private static void Main(string[] args)
{
    Console.WriteLine("Enter your age");
    var age = int.Parse(Console.ReadLine() ?? throw new InvalidOperationException());

    if (5 <= age && age <= 10)
    {
        Console.WriteLine("Range 5 - 10");
    }else if (11 <= age && age <= 20)
    {
        Console.WriteLine("Range 11 - 20");
    }
    else if (21 <= age && age <= 30)
    {
        Console.WriteLine("Range 21 - 30");
    }
    else
    {
        Console.WriteLine("Over range");
    }
}

假设客户需要动态更改条件,这意味着他需要向系统添加额外的条件,例如,

if 31 <= age && age <= 40 =>范围 31 - 40

在客户端执行此操作时,有时可能会向系统添加错误条件,例如,

(4 <= age && age <= 15)这个条件不能加,因为系统已经有条件了(5 <= age && age <= 10)。当年龄为 7 岁时,这两个条件都将成立。像这种情况下最好的事情是什么。

我需要将条件存储在我的数据库中,(PS:数据库表结构可以根据您的回答进行更改)

作为样本表结构

ConditionID    Condition                  Details

con001         5 <= age && age <= 10      Range 5 - 10
con002         11 <= age && age <= 20     Range 11 - 20
con003         21 <= age && age <= 30     Range 21 - 30

请给我一个解决方案来解决这个问题。如何使用 C# 和 oracle SQL 做到这一点

标签: c#sql.netif-statement

解决方案


首先,您不需要将 存储Details为列,因为您可以稍后在代码中以动态方式构建它。其次,您也不需要将其存储Condition为字符串列,因为当您想将其解析为 C# 代码中的条件时,它会使您的工作更加复杂。您所需要的只是将两个整数值存储在您的数据库中,作为LowerUpper的范围值和ConditionID标识。你的表应该是这样的:

CREATE TABLE [dbo].[tblConditions] (
[ConditionID] INT IDENTITY (1, 1) NOT NULL,
[Lower]       INT NOT NULL,
[Upper]       INT NOT NULL,
PRIMARY KEY CLUSTERED ([ConditionID] ASC)
);

然后你可以在你的代码中写这样的东西:

Console.WriteLine(@"Enter your age");
var age = int.Parse(Console.ReadLine() ?? throw new InvalidOperationException());

using (var db = new forTestEntities())
{
    var result = db.tblConditions.Where(c => c.Lower <= age && age <= c.Upper).AsEnumerable()
        .Select(c => $"Range {c.Lower} - {c.Upper}")
        .DefaultIfEmpty("Over range").SingleOrDefault();

    Console.WriteLine(result);
}

编辑:如果你不熟悉这个$运算符,它被称为字符串插值,它在 C# 6+ 中可用,如果你使用的是旧版本的 C#,你可以string.Format这样使用:

c => string.Format("Range {0} - {1}", c.Lower, c.Upper)

此外,要向数据库添加动态条件,您可以使用以下代码:

Console.WriteLine(@"Enter Lower");
var lower = int.Parse(Console.ReadLine() ?? throw new InvalidOperationException());

Console.WriteLine(@"Enter Upper");
var upper = int.Parse(Console.ReadLine() ?? throw new InvalidOperationException());

using (var db = new forTestEntities())
{
    var newCondition = new tblCondition
    {
        Lower = lower,
        Upper = upper
    };

    var range = Enumerable.Range(newCondition.Lower, 
                            newCondition.Upper - newCondition.Lower + 1);

    var check = db.tblConditions.AsEnumerable().Any(c => range
                .Intersect(Enumerable.Range(c.Lower, c.Upper - c.Lower + 1)).Any());

    if (!check)
    {
        db.tblConditions.Add(newCondition);
        db.SaveChanges();
    }
}

请注意:我使用了 SQL Server 和 Entity Framework-DB First 方法,您可以根据需要进行更改。


推荐阅读