我会试着很好地解释这一点,因为它很奇怪。
我有一个带有 Linq2SQL 的 .NET MVC 4 应用程序,我正在开发一个搜索,用户可以在其中通过一个或多个不同的值查找元素。
我有一个接收字符串的方法:"value1&value2|value3&value4"
我假装返回结果,其中确定的元素包含值 1 和值 2 或确定的元素包含值 3 和值 4。
我正在使用这样的算法:
if (!String.IsNullOrEmpty(figuresSelected)) {
string[] groupsOR = figuresSelected.Split('|');
IQueryable<CENTROSOPERACIONES> sqlAuxOr = null;
foreach (string goupOR in groupsOR) {
string[] groupsAND = groupOR.Split('&');
IQueryable<CENTROSOPERACIONES>[] sqlAuxAnd = sql; //sql contains current query so far
foreach (string group in groupsAND) {
sqlAuxAnd = sqlAuxAnd.Where(o => o.CENTROS.FIGURASCENTROS.Any(f => f.FIGURAS.nombre == group));
}
if (sqlAuxAnd != null)
if (sqlAuxOr == null)
sqlAuxOr = sqlAuxAnd;
else
sqlAuxOr = sqlAuxOr.Union(sqlAuxAnd);
}
}
好吧,这里的问题是,在内部循环内的每次迭代中,sqlAuxAnd 查询来自 sql 上的原始数据容器,而不是来自在前一个循环中获得的子结果。我已经逐次跟踪循环迭代,并检查了 sqlAuxAnd 是否包含第一次迭代的预期子结果,但是当到达第二次迭代时,该值会丢失,并且来自整个数据的完整查询存储在其中。
我试图将sqlAux和部分结果存储在不同的元素上(我使用了一个数组)并检查了它的演变。在第一次迭代中,sqlAuxAnd[0] 包含预期结果,sqlAuxAnd[1] 为空,在第二次迭代中,两个元素 sqlAuxAnd[0] 和 sqlAuxAnd[1] 都包含从整个数据集中查询第二个值的预期结果。
看来我在这里失去了一些东西...可能是微不足道的事情,但我怀疑我太头晕了,看不到它。有人有什么想法要分享吗?请随时就此事寻求解释,英语不是我的母语,我认为这个问题可能没有像应有的那样编辑。
你需要从foreach中捕获group
变量:
foreach (string group in groupsAND) {
var captured = group;
sqlAuxAnd = sqlAuxAnd.Where(o => o.CENTROS.FIGURASCENTROS.Any(f => f.FIGURAS.nombre == captured));
}
请参阅内置 foreach 循环的 Linq 查询始终从上次迭代中获取参数值。