【发布时间】:2016-02-11 06:44:33
【问题描述】:
我有以下带有 Or 条件的语句。我正在寻找两个条件都为真时的结果。
var result = db.Result.FirstOrDefault(x=>(x.ID==50||x.ID==60)&&x.Name="XYZ");
如果我在结果表中有一行同时满足两个条件,即; x.ID=50 和 x.ID=60。查询的结果是什么?
我已经在测试环境中进行了测试以获得结果。但我想确保无论数据库大小如何,执行顺序始终保持不变。正如我所读到的,where 子句使用某种索引来加快检索速度,该语句的执行过程是什么。
提供的查询只是一个示例,名称 ID 与表的唯一标识无关。
问题
如何对数据库执行检查?我希望它首先检查ID ==50 和失败检查ID==60 的结果。如果这是我的预期结果,上面给出的查询会完成我的任务吗?
回答后更新
我觉得有必要举一个更清楚的例子,这样问题就更容易理解了。 (如果此更新使现有答案无效,我真的很抱歉)
var result = db.result.firstordefault(x=>(x.foreignkeyid == someval|| foreignkeyid == 123)&& x.Name=="XYZ");
还有我的数据库示例
ID foreignkeyid Name
1 123 XYZ
2 somevalue XYZ
3 anothervalue XYZ
在这种情况下,执行查询时,结果将返回带有 ID==1 的行,但我希望返回带有 ID==2 的行。
实现结果的最坏情况尝试
var result = new Result();
result =db.Result.firstordefault(x=>x.ID==somevalue&&x.name==xyz);
if(result==null)
var result = db.firstordefault(x=>x.ID ==123&& x.name==xyz);
【问题讨论】:
-
您的查询正在检查
Name是否为 XYZ,ID是否为 50 或 60。它达到了您的要求。 -
是的。我错过了我添加了那个条件。我将编辑问题以使其成为真实。
-
有可能不满足特定条件。我即使尝试这种方式
(foreignkeyid==somevalue &&name==XYZ)||(foreignkeyid==123&&name==XYZ)。但这也将等同于我猜的上述查询 -
对于这种情况,它的优化器决定了查询的计划方式,所以如果它发现匹配记录的条件很早就被检索到,那么它将得到那个。因此,对此没有硬性规定。但是,您可以强制优化器使用 order by 子句检索记录,例如
order by ID desc limit 1
标签: c# mysql asp.net-mvc linq