c# – 如何动态检查语句

前端之家收集整理的这篇文章主要介绍了c# – 如何动态检查语句前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题如下,我需要通过数据库检查条件.这意味着在简单的应用程序中我们检查这样的条件.
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");
    }
}

假设客户端需要动态更改条件,这意味着他需要向系统添加附加条件,如:

如果31 <=年龄&&年龄< = 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执行此操作

解决方法

首先,您不需要将详细信息存储为列,因为您可以稍后在代码中以动态方式构建它.其次,您不需要将Condition存储为字符串列,因为当您想要将其解析为C#代码中的条件时,它会使您的工作更加复杂.您只需要在数据库中存储两个整数值作为范围的Lower和Upper值,并生成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方法,您可以根据自己的要求进行更改.

猜你在找的C#相关文章