Where 子句中条件的执行顺序
Order of Execution of Condition in a Where clause
我有以下带有 Or 条件的语句。我正在寻找当两个条件都为真时的结果。
var result = db.Result.FirstOrDefault(x=>(x.ID==50||x.ID==60)&&x.Name="XYZ");
如果我在结果中有一行 table 两个条件都为真,即; x.ID=50
和 x.ID=60
。查询的结果是什么?
我已经在测试环境下测试得到结果。但我想确保无论数据库大小如何,执行顺序始终保持不变。正如我所读到的,where 子句使用某种索引来加快检索速度,这条语句的执行过程是什么。
提供的查询只是一个示例,名称 ID 与 table 的唯一标识无关。
问题
如何对数据库进行检查?我希望得到一个结果,它首先检查是否 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
在这种情况下,当执行查询时,结果将 return 带有 ID==1
的行,但我希望带有 ID==2
的行被 returned。
达到结果的最坏情况尝试
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);
鉴于你的这个例子:
var result = db.result.firstordefault(x=>(x.foreignkeyid == someval|| foreignkeyid == 123)&& x.Name=="XYZ");
你想在fk = someval
(fk: foreign key)中优先处理结果,你可以这样做:
db.set.OrderBy(x => x != someval) // false actually comes before true
.ThenBy(x => x != val2ndPriority)
.FirstOrDefault(x => (x.fk == someval ||
x.fk == val2ndPriority ||
x.fk == leastPriorityVal) &&
x.Name == "XYZ");
如果你有很多"prioritized fk values",或者如果它们在编译时是未知的,你可以这样做:
var orderedEnum = db.set.OrderBy(x => x.Id);
foreach (var fk in fksByPriority)
orderedEnum = orderedEnum.ThenBy(x => x != fk);
var result = orderedEnum.FirstOrDefault(x => fksByPriority.Contains(x.fk) &&
x.Name == "XYZ");
我希望它看起来像什么:
另一种不同的方法是获取所有可能相关的记录,然后在数据库外部运行 类似的逻辑(您的数据库 Linq 通常 运行 在数据库内部巧妙地查询):
var results = db.set.Where(x => x.Name == "XYZ" &&
fks.Contains(x.fk)).ToArray();
var highestPriorityResult =
results.OrderBy(x => fksByPriority.IndexOf(x.fk)).FirstOrDefault();
最后一点,我想说你的问题表明设计可能存在缺陷。我无法想象为什么您会遇到这种使用优先级外键进行过滤的问题。
我有以下带有 Or 条件的语句。我正在寻找当两个条件都为真时的结果。
var result = db.Result.FirstOrDefault(x=>(x.ID==50||x.ID==60)&&x.Name="XYZ");
如果我在结果中有一行 table 两个条件都为真,即; x.ID=50
和 x.ID=60
。查询的结果是什么?
我已经在测试环境下测试得到结果。但我想确保无论数据库大小如何,执行顺序始终保持不变。正如我所读到的,where 子句使用某种索引来加快检索速度,这条语句的执行过程是什么。
提供的查询只是一个示例,名称 ID 与 table 的唯一标识无关。
问题
如何对数据库进行检查?我希望得到一个结果,它首先检查是否 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
在这种情况下,当执行查询时,结果将 return 带有 ID==1
的行,但我希望带有 ID==2
的行被 returned。
达到结果的最坏情况尝试
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);
鉴于你的这个例子:
var result = db.result.firstordefault(x=>(x.foreignkeyid == someval|| foreignkeyid == 123)&& x.Name=="XYZ");
你想在fk = someval
(fk: foreign key)中优先处理结果,你可以这样做:
db.set.OrderBy(x => x != someval) // false actually comes before true
.ThenBy(x => x != val2ndPriority)
.FirstOrDefault(x => (x.fk == someval ||
x.fk == val2ndPriority ||
x.fk == leastPriorityVal) &&
x.Name == "XYZ");
如果你有很多"prioritized fk values",或者如果它们在编译时是未知的,你可以这样做:
var orderedEnum = db.set.OrderBy(x => x.Id);
foreach (var fk in fksByPriority)
orderedEnum = orderedEnum.ThenBy(x => x != fk);
var result = orderedEnum.FirstOrDefault(x => fksByPriority.Contains(x.fk) &&
x.Name == "XYZ");
我希望它看起来像什么:
另一种不同的方法是获取所有可能相关的记录,然后在数据库外部运行 类似的逻辑(您的数据库 Linq 通常 运行 在数据库内部巧妙地查询):
var results = db.set.Where(x => x.Name == "XYZ" &&
fks.Contains(x.fk)).ToArray();
var highestPriorityResult =
results.OrderBy(x => fksByPriority.IndexOf(x.fk)).FirstOrDefault();
最后一点,我想说你的问题表明设计可能存在缺陷。我无法想象为什么您会遇到这种使用优先级外键进行过滤的问题。