如何动态检查语句是否

时间:2018-08-02 03:31:40

标签: c# sql .net if-statement

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

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

2 个答案:

答案 0 :(得分:5)

首先,您不需要将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);
}

编辑:如果您不熟悉此$运算符,则将其称为String Interpolation,如果使用的是旧版本,则在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方法,您可以根据需要进行更改。

答案 1 :(得分:0)

要做到这一点,您只需要存储一个数字列表即可。尝试这样的事情:

var ages = new [] { 5, 10, 20, 30 };

var limits = ages.Zip(ages.Skip(1), (a0, a1) => new
{
    lower = a0,
    upper = a1,
    message = $"Range {a0} - {a1}"
});

var age = int.Parse(Console.ReadLine());
var message =
    limits
        .Where(l => l.lower <= age && l.upper >= age)
        .Select(l => l.message)
        .DefaultIfEmpty("Over range")
        .First();

Console.WriteLine(message);

如果我运行它并输入25,则会出现消息"Range 20 - 25"