c# - 如何动态检查 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 做到这一点
解决方案
首先,您不需要将 存储Details
为列,因为您可以稍后在代码中以动态方式构建它。其次,您也不需要将其存储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);
}
编辑:如果你不熟悉这个$
运算符,它被称为字符串插值,它在 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 方法,您可以根据需要进行更改。
推荐阅读
- javascript - 错误 func.apply 不是本机反应中的函数错误
- amazon-web-services - 如何扫描完整的 DynamoDb 表并获取所有 hashkey 并对结果进行分页?
- python - 如何使用 SQL 从 Seconds 列创建 Date 和 Hour 列
- ruby-on-rails - Ruby 包含/扩展模块:一个类方法 - 初学者
- angular - 我正在尝试使用 Cloudinary post API 上传图像而不使用 Cloudinary SDK
- vue.js - :hover 来自 props 的 vue 组件中的颜色
- pyspark - pyspark pandas_udf 函数出错后跟官方示例
- linux - 是否可以启动一个 linux 进程,获取 PID,但在某些条件下稍后开始运行?
- javascript - 从具有不同文件名的 URL 下载文件
- c - 为什么我的代码在 Visual 中不起作用,但在 CodeBlocks 中起作用?