我的问题如下,我需要通过数据库检查条件.这意味着在简单的应用程序中我们检查这样的条件.
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
解决方法
首先,您不需要将详细信息存储为列,因为您可以稍后在代码中以动态方式构建它.其次,您不需要将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方法,您可以根据自己的要求进行更改.