Where子句中条件的执行顺序

时间:2016-02-11 06:44:34

标签: c# mysql asp.net-mvc linq

我有以下语句和条件。我正在寻找两种情况都是真实的结果。

 var result = db.Result.FirstOrDefault(x=>(x.ID==50||x.ID==60)&&x.Name="XYZ");

如果我在结果表中有一行,其中两个条件都为真,即; x.ID=50x.ID=60。查询的结果是什么?

我已经测试过在测试环境中获得结果。但我想确保无论数据库的大小如何,执行顺序始终保持不变。正如我已经读过,where子句使用某种索引来加快检索速度,这个语句的执行过程是什么。

提供的查询只是一个示例,名称ID与表的唯一标识无关。

问题

如何在数据库上执行检查?我希望得到一个结果,它首先检查ID ==50是否{0}}失败检查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);

1 个答案:

答案 0 :(得分:1)

鉴于你的这个例子:

var result = db.result.firstordefault(x=>(x.foreignkeyid == someval|| foreignkeyid == 123)&& x.Name=="XYZ");

您希望在fk = someval(fk:外键)中优先处理结果,您可以执行以下操作:

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");

如果您有很多"优先fk值",或者如果它们在编译时未知,您可以这样做:

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");

我希望它看起来如何:

另一种不同的方法是获取所有可能相关的记录,然后在数据库之外运行类似的逻辑(您的db 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();

最后,我想说你的问题表明设计可能存在缺陷。我无法想象为什么你会有这个过滤优先的外键问题。