我的问题如下,我需要通过数据库检查条件。这意味着在简单的应用程序中,我们将检查是否存在这种情况。
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
答案 0 :(得分:5)
首先,您不需要将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);
}
编辑:如果您不熟悉此$
运算符,则将其称为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"
。